日前,大家在公司讨论一个很激烈的问题,原来有个小黑客在网上通过模拟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