日前,大家在公司討論一個很激烈的問題,原來有個小黑客在網上通過模擬ip和post請求,不斷訪問發送短信的接口,要知道,發送短信這個功能是接入第三方平臺來完成的!每一條短信的發送就代表着流量和短信條數的流失,造成金錢的浪費。經過兩天的試驗,大神簡單設計了一個算法,暫時解決了該問題,也跟大神學習一下:
首先發送短信的功能是用阿里雲的服務實現的,它首先提供了一個風險攔截系統!也做出了基本限制,比如,每個ip每個電話號碼每天可以發送10條等。實現方式:
1. 在html頁面添加風控控件和加密隱藏字符串:
<input id="encodeString" value="${encodeString}" hidden/>
<!-- 此段必須要引入 -->
<div id="_umfp" style="display:none;width:1px;height:1px;overflow:hidden"></div>
<!-- 引入結束 -->
<div class="form-group" style="display:none;" id="afsCheck">
<div id="dom_id"></div>
<!-- 風險攔截參數 -->
<input type='hidden' id='csessionid' name='session'/>
<input type='hidden' id='sig' name='sig'/>
<input type='hidden' id='token' name='token'/>
<input type='hidden' id='scene' name='scene'/>
</div>
2.js代碼
//反欺詐初始化
var nc = new noCaptcha();
var nc_appkey = 'xxx'; // 應用標識,不可更改
var nc_scene = 'register'; //場景,不可更改
var nc_token = [nc_appkey, (new Date()).getTime(), Math.random()].join(':');
var nc_option = {
renderTo: '#dom_id',//渲染到該DOM ID指定的Div位置
appkey: nc_appkey,
scene: nc_scene,
token: nc_token,
//trans: '{"name1":"code100"}',//測試用,特殊nc_appkey時才生效,正式上線時請務必要刪除;code0:通過;code100:點擊驗證碼;code200:圖形驗證碼;code300:惡意請求攔截處理
callback: function (data) {// 校驗成功回調
document.getElementById('csessionid').value = data.csessionid;
document.getElementById('sig').value = data.sig;
document.getElementById('token').value = nc_token;
document.getElementById('scene').value = nc_scene;
var afsToken=$("#encodeString").val();
/*reloadAbleJSFn("afs","//g.alicdn.com/sd/pointman/js/pt.js");*/
$("#basic-addon2").unbind();
$("#basic-addon2").click(function(){
//風險識別
/*pointman.use('do', function () {
var afs = pointman.getConfig();
afsToken = afs.token;
});*/
var mobile = $("#phoneRegister").val();
if(checkWeixinMobile("#phoneRegister",mobile)&&checkUserIsJoin("#phoneRegister",mobile)){
//發送驗證碼並且成功
if(saveAfsData(mobile,afsToken,'000001')==1&&sendValidateCode(mobile,'000001')==0){
countDown("basic-addon2",59,mobile,'000001')
}
}
});
}
};
nc.init(nc_option);
public static String encryption(HttpServletRequest request){
String sysRandomNum=new StringBuilder("要加密的字符串").toString();
MessageDigest md5;
try {
md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64en=new BASE64Encoder();
sysRandomNum=base64en.encode(md5.digest(sysRandomNum.getBytes("utf-8")));
} catch (Exception e) {
e.printStackTrace();
}
return sysRandomNum;
}
參考資料:
http://download.csdn.net/detail/chuanyu/8819109#comment
http://blog.csdn.net/hudashi/article/details/8394158
http://blog.csdn.net/anhuixiaozi/article/details/6219337