<tr id="ieeco"><small id="ieeco"></small></tr>
<acronym id="ieeco"></acronym>

短信接口被惡意調用?企業短信防火墻+【中昱維信】短信驗證碼【Java】

一、企業短信防火墻的實現

1.1 簡介

新昕科技在交易反欺詐核心上, 通過AI快速學習機制,結合國際領先的設備指紋技術,首次推出無需圖形驗證碼機制的企業短信防火墻,三步完成下載對接。
在這里插入圖片描述

1.2 第一步:獲取防火墻帳號密鑰

進入 防火墻控制臺,在左側導航欄選擇【網站管理】,進入網站管理頁面,單擊【發到郵箱】接收密鑰。
在這里插入圖片描述

1.3 第二步:下載防火墻服務器

前往新昕科技官網,在頂部導航欄選擇【解決方案】>【下載中心】,進入下載中心頁面,找到短信防火墻服務器安裝包,點擊【下載鏈接】即可下載。

1.4 第三步:業務系統前后端接入

web 前端接入:
前端接入:
Web前端接入文檔
Java 在頁面合適的位置(標簽內)加入以下代碼引入JS文件:

<script type="text/javascript" src="/NxtJsServlet"></script>

后端接入:
Java
修改配置(和業務系統同系統不需要修改):
newxtc.ini (存放位置:"/WEB-INF/classes/newxtc.ini")
修改參數(fireWareUrl)–> fireWareUrl=http://localhost:7502
短信下發

public RetMsg smsSend(HttpServletRequest request, HttpServletResponse response, String clientMobile) {
    RetMsg retMsg = new RetMsg(-1, "系統異常");
    FwClient fwClient = new FwClientImpl();
    try {
        // 1 調用【短信防火墻】短信發送請求
        HashMap < String, Object > paramMap = fwClient.getSendReq(request, clientMobile);
        String jsonReq = fwClient.execReq(paramMap);
        String smsSendRet = fwClient.getRetVaule(jsonReq, "riskResult");
        if("REJECT".equals(smsSendRet)) {
            retMsg.setRet(3);
            retMsg.setMsg("請求過于頻繁");
        }
        else {
            // 業務 TODO
            // 業務調用短信接口 TODO
            // 調用短信接口 結束
            if(smsRetMsg != null && smsRetMsg.getRet() == 0) {
                // 2 調用【短信防火墻】成功結果
                fwClient.execSucc(paramMap);
                logger.debug("send succ");
                retMsg.setRet(0);
                retMsg.setMsg("發送驗證碼成功");
            }
            else {
                // 2 調用【短信防火墻】失敗結果
                SmsVerifyCache.getInstance().remove(clientMobile);
                fwClient.execFail(paramMap);
                retMsg.setRet(-1);
                retMsg.setMsg("發送驗證碼失敗");
            }
        }
    }
    catch(Exception e) {
        for(StackTraceElement elment: e.getStackTrace()) {
            logger.error(elment.toString());
        }
    }
    return retMsg;
}

短信驗證

public RetMsg smsVerify(HttpServletRequest request, HttpServletResponse response, String clientMobile, String smsVerifyCode) {
    FwClient fwClient = new FwClientImpl();
    RetMsg retMsg = new RetMsg(-1, "系統異常");
    if(smsVerifyCode == null || smsVerifyCode.isEmpty()) {
        retMsg.setRet(1);
        retMsg.setMsg("輸入驗證碼為空");
    }
    else {
        // 1 調用【短信防火墻】驗證請求
        HashMap < String, Object > paramMap = fwClient.getVerifyReq(request, clientMobile); // 請求防火墻
        String jsonReq = fwClient.execReq(paramMap);
        // 報文處理
        String smsSendRet = fwClient.getRetVaule(jsonReq, "riskResult");
        if("REJECT".equals(smsSendRet)) {
            retMsg.setRet(3);
            retMsg.setMsg("請求過于頻繁");
        }
        // 業務 TODO
        if(cacheSmsVerify != null && cacheSmsVerify.getVerifyCode() != null && !cacheSmsVerify.getVerifyCode().isEmpty()) {
            if(cacheSmsVerify.getVerifyCode().equals(smsVerifyCode)) {
                retMsg.setRet(0);
                retMsg.setMsg("驗證成功");
            }
            else {
                retMsg.setRet(1);
                retMsg.setMsg("驗證碼錯誤");
            }
        }
        else {
            retMsg.setRet(-9);
            retMsg.setMsg("驗證碼超時");
        }
        if(retMsg.getRet() == 0) {
            // 2 調用【短信防火墻】成功結果
            fwClient.execSucc(paramMap);
        }
        else {
            // 2 調用【短信防火墻】失敗結果
            fwClient.execFail(paramMap);
        }
    }
    return retMsg;
}

1.5豐富可視化實時風險大盤,

防御攔截數據盡收眼底,實時查看當日數據詳情與近期風險趨勢。
通過風控數據看板,可查看1-30天的驗證情況、風控攔截情況以及驗證事件觸發的AI模型情況。
進入防火墻控制臺,在左側導航欄選擇【風險大盤】,進入風險大盤頁面。
在這里插入圖片描述

二、短信驗證碼的實現

2.1 簡介

企業防火墻只能防止機器人腳本惡意攻擊網站或App,如何識別到是本人操作的,還需要結合短信驗證碼進一步進行身份識別。本文以注冊為例,在SpringMVC+Spring+Mybatis框架的基礎上完成該短信驗證碼功能。

發送短信驗證碼的原理是:隨機生成一個4-6位數字,將該4-6位數字保存到session當中,客戶端通過sessionid判斷對應的session,用戶輸入的驗證碼再與session記錄的驗證碼進行比較。

一般的第三方短信平臺都會有他們自己的短信接口,只要讀懂他們的接口稍作稍作改變就能滿足自己的需求。

首先將短信平臺接口代碼列出:這里需要依賴的三個通用jar包 commons-logging-1.1.1.jar,commons-httpclient-3.1.jar,commons-codec-1.4.jar。

2.2 短信服務商接入

開發短信驗證碼功能通常是采用第三方短信服務商的服務,作為短信下發渠道,以這個網站短信驗證碼為例:https://www.veesing.com上海中昱文化傳播有限公司【簡稱中昱維信】成立于2010年,是一家從事增值電信業務和軟件開發服務的科技企業。獲取試用驗證碼條數和驗證碼接口文檔,進行接口對接前需首先進行準備工作:

短信簽名報備

短信驗證碼需預先設置短信簽名,簽名會經過平臺審核,審核通過后才可作為接口參數使用。
在這里插入圖片描述
短信驗證碼模板報備

短信驗證碼需預先設置短信模板,簽名會經過平臺審核,審核通過后才可作為接口參數使用。

獲取appId和appKey

為保障接口安全,短信驗證碼接口,使用多重加密的appId和appKey進行身份鑒權和校驗,這兩個字段作為驗證碼接口必填項,建議預先獲取到,獲取appKey時需要對注冊人進行身份校驗。

至此,短信服務商驗證碼接口已經準備完畢,接下來可以進行業務場景,進行短信驗證碼服務的開發,下面展示通用的短信驗證碼接入流程。
2.3 短信驗證碼代碼實現

短信驗證碼前端較為簡單,主要就是發送驗證碼和校驗驗證碼兩個ajax請求,結合上面的滑動驗證可實現雙重驗證。前端頁面結構如下:

 <html>
    <head>
        <meta charset="utf-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
        <!-- 國內使用 -->
        <link rel="stylesheet" href="https://cdn.staticfile.org/amazeui/2.7.2/css/amazeui.min.css">
        <script type="text/javascript" charset="utf-8" src="https://cdn.staticfile.org/jquery/3.3.1/jquery.min.js"></script>
    </head>
    <body>
     
    <div class="am-form">
        <div class="am-form-group">
            <label for="tel">請輸入手機號</label>
            <input type="text" class="" id="tel" placeholder="請輸入手機號">
        </div>
     
        <div id="__nc" style="height: 70px">
            <div id="nc"></div>
        </div>
     
        <div class="am-form-group">
            <label for="code">請輸入驗證碼</label>
            <input id="code" type="text" placeholder="請輸入驗證碼">
        </div>
     
        <button type="button" class="am-btn am-btn-primary">提交</button>
    </div>
     
    <script>
        var nc_token = ["CF_APP_1", (new Date()).getTime(), Math.random()].join(':');
        var nc=NoCaptcha.init({
            renderTo: '#nc',
            appkey: 'CF_APP_1',
            scene: 'register',
            token: nc_token,
            trans: {"key1": "code200"},
            elementID: ["usernameID"],
            is_Opt: 0,
            language: "cn",
            timeout: 10000,
            retryTimes: 5,
            errorTimes: 5,
            inline:false,
            apimap: {
    // 'analyze': '//a.com/nocaptcha/analyze.jsonp',
    // 'uab_Url': '//aeu.alicdn.com/js/uac/909.js',
            },
            bannerHidden:false,
            initHidden:false,
            callback: function (data) {
                window.console && console.log(nc_token)
                window.console && console.log(data.csessionid)
                window.console && console.log(data.sig);
                var tel = $('#tel').val();
                $.ajax({
                    url: "sendCode",
                    type: "post",
                    data: {
                        tel:tel
                    },
                    dataType: "json",
                    success: function (result) {
                        if (result.code == 0) {
                            alert("驗證碼已發送!", "green")
                        } else {
                            alert("發送失敗,請稍后再試!");
                            nc.reset()
                        }
                    },
                    error: function () {
                        alert("系統繁忙,請稍后再試!", "red")
                    }
                })
            },
            error: function (s) {
            }
        });
        NoCaptcha.setEnabled(true);
        nc.reset();//請務必確保這里調用一次reset()方法
     
        NoCaptcha.upLang('cn', {
            'LOADING':"加載中...",//加載
            'SLIDER_LABEL': "請向右滑動驗證",//等待滑動
            'CHECK_Y':"驗證通過",//通過
            'ERROR_TITLE':"非常抱歉,這出錯了...",//攔截
            'CHECK_N':"驗證未通過", //準備喚醒二次驗證
            'OVERLAY_INFORM':"經檢測你當前操作環境存在風險,請輸入驗證碼",//二次驗證
            'TIPS_TITLE':"驗證碼錯誤,請重新輸入"//驗證碼輸錯時的提示
        });
    </script>
    </body>
    </html>

后端代碼主要職責是兩方面:1)接收生成驗證碼請求,生成驗證碼存入session中;2)接收校驗驗證碼的請求,將存入session的驗證碼去除,與前端輸入的驗證碼進行比對,比對一致則通過并進行視圖轉發,比對不一致則告知前端錯誤原因。主要實現代碼如下:

  HttpSession session = req.getSession();
    // 驗證碼有效時間
    session.setMaxInactiveInterval(600);
    try {
        Integer num = RandNumber.getNum();
        //  發送驗證碼通道
        Sendsms.Send(num, phone);
        session.setAttribute(phone, num);
        return R.ok();
    } catch (Exception e) {
        e.printStackTrace();
        logger.error(e.getMessage());
        return R.error("fasle");
    }

    import java.io.Exception;
     
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.NameValuePair;
    import org.apache.commons.httpclient.methods.PostMethod;
     
    public class Sendsms {
     
      private static String Url = "https://vip.veesing.com/smsApi/verifyCode";
     
      // 發送短信驗證碼
      public static void Send(Integer num, String mobile) {
        try {
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(Url);
        client.getParams().setContentCharset("UTF-8");
        method.setRequestHeader("ContentType", "application/x-www-form-urlencoded;charset=UTF-8");
        NameValuePair[] data = { 
            new NameValuePair("appId", "*********"),
            new NameValuePair("appKey", "**********"), 
            new NameValuePair("templateId", "*******"), 
            new NameValuePair("mobile", "*******"),
            new NameValuePair("variables", "*******") 
            };
        method.setRequestBody(data);
        client.executeMethod(method);
        String submitResult = method.getResponseBodyAsString();
        System.out.println(submitResult);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
     
    }

    HttpSession session = req.getSession();
    String yzm = String.valueOf(session.getAttribute(username));
    logger.info(yzm);
    if (yzm == null) {
        return R.error("驗證碼錯誤");
    }
    if (yzm != null && !verifycode.equals(yzm)) {
        return R.error("驗證碼錯誤");
    }

以上就是Java實現企業短信防火墻與短信驗證碼的全部實現,基于此案例,可實現安全性高、用戶體驗好的登錄注冊+企業短信防火墻+短信驗證碼功能。

如有問題可在留言區展開討論哦,歡迎轉發,如有改動請站內信通知本文作者,謝謝!

newxtc 風控大牛
相關推薦
彩票送彩金