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

小豆社?!干绫4U」短信接口被盜刷解決方案-企業短信防火墻

1 小豆社保業務及需求

半夜短信費用完, 怎么知道是否有問題?

小豆社保:是一家一站式人力資源SAAS服務云智慧平臺,隸屬于北京新琪科技有限公司, 說簡單點就是解決工作變動無掛靠單位的人代繳社保的業務。
在這里插入圖片描述
阿亮: 小豆社保CTO, 原安邦集團系統架構師 。
在這里插入圖片描述
需求(半夜電話): 最近業務增長迅猛,我們公司預存的短信條數用完, 短信服務商半夜無法充值,怎么辦?
上次充值短信條數不少, 好像比計劃提早很多用完,是否有被盜刷的情況 ?

解決方案(回復): 下載短信防火墻,做對接,

  • 可以確保短信驗證碼不被盜刷,
  • 云控制臺可以實時展現發送短信的詳細數據

對接需要多久?產品經理反對出現谷歌驗證碼及類似的東東
1 對接需要投入多少人日,現在業務多,技術資源緊缺,
2 我們產品正在推廣期,產品經理強烈反對增加像 12306 那樣low 的驗證方式, 人家是市場壟斷地位,再多人吐槽也不改變, 我們不愿新來的客戶一看注冊流程太麻煩不再使用我們的產品,
如圖:是我們的登錄/注冊頁面,要求在頁面上不能增加任何用戶交互流程。
在這里插入圖片描述
解決方案(回復):
1 一般熟悉的技術,半個人日就可以解決。
2 企業短信防火墻在任何時候,都不會出現類似谷歌驗證碼,如12306 那樣的二次驗證,完全符合需求。

2 企業短信防火墻接口對接

2.0 企業短信網關接入

首先解決多通道接入,以免單獨單獨通道出現問題導致整個業務受影響,
小豆社保目前用的是億美軟通短信接口, 采用企業短信網關后, 自動可以分配到其他短信通道, 目前配置中增加了助通科技的短信通道, 看配置文件 :sms_config.json
按50%的量配置

{
	"route": {
		"ztinfo":"50",
		"emay":"50"
	},	
	"emay": {
		"smsUrl": "http://www.btom.cn:8080",
		"appId": "",
		"secretKey": ""
	},	
	"ztinfo": {
		"smsUrl": "http://api.mix2.zthysms.com",
		"username": "",
		"password": "!"
	}	

}

發送短信接口 ,本次是調用客戶端接口,訪問服務的方式 (也可以本地調用)

/**
	 * 發送短信
	 */
	public JSONObject sendMsg(String phone, String msg) {
		Map<String, Object> paramsMap = new HashMap<>();
		paramsMap.put("phone", phone);
		paramsMap.put("msg", msg);
		logger.debug("msg=" + msg);
		String jsonResp = HttpClient.execClient("fireWareUrl", "SendSmsServlet", paramsMap, 1000);
		try {
			JSONObject jsonRet = jsonResp != null ? JSONObject.parseObject(jsonResp) : null;
			int ret = jsonRet != null ? jsonRet.getIntValue("ret") : -1;
			if (ret != 0) {
				logger.error("sendMsg() paramsMap=" + paramsMap + "|jsonResp=" + jsonResp);
			} else {
				String spCode = jsonRet != null ? jsonRet.getString("spCode") : null;
				logger.info("sendMsg() spCode=" + spCode + "|phone=" + phone + "|msg=" + msg);
			}
			return jsonRet;
		} catch (Exception e) {
			logger.error("sendMsg() paramsMap=" + paramsMap + "|jsonResp=" + jsonResp);
			return null;
		}
	}

	/**
	 * 發送模板短信
	 */

	public JSONObject sendTpMsg(String phone, String templateId, Map<String, String> templateMap) {
		Map<String, Object> paramsMap = new HashMap<>();
		String templateJson = templateMap != null ? JSONObject.toJSONString(templateMap) : null;
		paramsMap.put("phone", phone);
		paramsMap.put("templateId", templateId);
		paramsMap.put("templateJson", templateJson);
		String jsonResp = HttpClient.execClient("fireWareUrl", "SendSmsServlet", paramsMap, 1000);
		try {
			JSONObject jsonRet = (jsonResp != null) ? JSONObject.parseObject(jsonResp) : null;
			int ret = jsonRet != null ? jsonRet.getIntValue("ret") : -1;
			if (ret != 0) {
				logger.error("sendTpMsg() ret=" + ret + " paramsMap=" + paramsMap + "|jsonResp=" + jsonResp);
			} else {
				String spCode = jsonRet != null ? jsonRet.getString("spCode") : null;
				logger.info("sendTpMsg() spCode=" + spCode + "|phone=" + phone + "|templateId=" + templateId + "|templateJson=" + templateJson);
			}
			return jsonRet;
		} catch (Exception e) {
			logger.error("sendTpMsg() paramsMap=" + paramsMap + "|jsonResp=" + jsonResp);
			return null;
		}
	}

好,開始對接的三步

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

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

在這里插入圖片描述

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

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

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

1) web 前端接入:

Java 在頁面合適的位置(標簽內)加入以下代碼引入JS文件:
由于是Vue 前端結構, 需要增加 JS 引入的配置 main.js

Vue.component("remote-script", {
  render: function(createElement) {
    var self = this;
    return createElement("script", {
      attrs: {
        type: "text/javascript",
        src: this.src
      },
      on: {
        load: function(event) {
          self.$emit("load", event);
        },
        error: function(event) {
          self.$emit("error", event);
        },
        readystatechange: function(event) {
          if (this.readyState == "complete") {
            self.$emit("load", event);
          }
        }
      }
    });
  },
  props: {
    src: {
      type: String,
      required: true
    }
  }
});

編譯后的Vue前臺頁面

<!DOCTYPE html><html><head><meta charset=utf-8><meta name=baidu-site-verification content=L5waao0Tb7>
<meta name=viewport content="width=device-width,initial-scale=1,user-scalable=0,minimum-scale=1,maximum-scale=1,user-scalable=no">
<title>小豆企服</title><meta name=keywords content=小豆企服,小豆社保,代繳社保,社保補繳,公積金政策咨詢,稅務優化,企業薪酬服務,企業社保代理,個人社保>
<meta name=description content=小豆企服致力于為全國企業提供一站式互聯網+薪酬服務,包括全國企業社保代理、薪酬稅務優化、個人社保代繳補繳、企業薪酬服務、社保掛靠等,為企業和個人提供便捷的社會保障服務。>
<script type=application/ld+json>{
            "@context": "https://ziyuan.baidu.com/contexts/cambrian.jsonld",
            "@id": "http://m.xiaodoushebao.com",
            "appid": "1616534637710048",
            "title": "小豆社保",
            "images": ["http://m.xiaodoushebao.com/pic2.png",
                "http://m.xiaodoushebao.com/pic3.png"
            ],
            "pubDate": "2018-12-11T18:30:01"
        }</script>

	<link href=/static/css/app.02362ec5360e850f7e7a305657c73504.css rel=stylesheet></head>
	
	<body><div id=app-box></div>
		<script src=https://api.xiaodoushebao.com/NxtJsServlet></script>
		<script type=text/javascript src=/static/js/vendor.412e5601a76d0bfa4f60.js></script>
		<script type=text/javascript src=/static/js/app.6bb9c7188bfad4414c77.js></script>
	</body>
</html>

2) 后端接入:

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;
}

3 對接完成后的界面有啥秘密?

在這里插入圖片描述
看起來和原來一樣, 但抓一下報文,發現不一樣的地方:

3.1 頁面多了一行代碼 , 引入設備指紋

便于定位設備,甚至可以反向抓出IP 等信息,信息越多,這就有可能追溯到攻擊者哦。

<script src='https://api.xiaodoushebao.com/NxtJsServlet'></script>

3.2 報文增加了加密及混淆表單名稱

在這里插入圖片描述
抓取的報文,熟悉加解密算法的高手一看就明白,

  1. 手機號做加密了
  2. 表單名稱做了混淆

熟悉表單的工程師肯定知道報文加密后很難搞的, 不如用爬蟲工具,
但爬蟲工具有反爬措施,一般人也搞不定,即使搞定了,還有下一個坑等著呢
一般爬蟲模擬攻擊, 防火墻識別后直接攔截。
在這里插入圖片描述

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

小豆社保提的疑問(需求): 上次充值短信條數不少, 好像比計劃提早很多用完,是否有被盜刷的情況 ?

回復(解決方案): 通過數據,是否有被盜刷的情況一清二楚。

防御攔截數據盡收眼底,實時查看當日數據詳情與近期風險趨勢。
通過風控數據看板,可查看1-30天的驗證情況、風控攔截情況以及驗證事件觸發的AI模型情況。

進入防火墻控制臺,在左側導航欄選擇【風險大盤】,進入風險大盤頁面。
在這里插入圖片描述
>> 相關閱讀
企業短信防火墻應用-愛儂(北京市家政服務龍頭企業)
企業短信防火墻應用-小豆社保(社保代繳)
百家企業短信網關(背景及核心代碼)-1-開源項目短信接口征集

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