防止软件进行微信小程序自动刷票、免费投票刷票器手机版的安全设计
网上各种投票特别多,很多没有做好安全设计,在各种投票漏洞,可以存在人为各种投票。最近发现有个站做法很值得大家借鉴,之前也听说过这种方法,可能之前关注不多,只是没有遇到过
一般防止重复投票,有http报文加签名,限制IP,限制浏览器,限制设备等。这些方法一般都可以通过技术手段绕过。而此站他们是在http报文里有个参数,是通过js方法动态计算出来的,即需要通过浏览器渲染,才能计算。方法名及方法体通过参数动生成的。
他们做法是:如有个简单投票 ,用浏览器打开这个页面时会加载一段js代码。其中
var show_vcode = false;
var estimate_map = {"5a7d604292beb53979067ff3": 4};
var total_seconds = 7;
var rand_int = 51;
var s_func_id = "78";
var vvv = "f76d6013749255a7a8768888c810fe28";
var func_name = "hEtdqAvW";
eval(eval("s1(10)+s1(102)+s1(117)+s1(110)+s1(99)+s1(116)+s1(105)+s1(111)+s1(110)+s1(32)+s1(104)+s1(69)+s1(116)+s1(100)+s1(113)+s1(65)+s1(118)+s1(87)+s1(40)+s1(112)+s1(51)+s1(55)+s1(50)+s1(41)+s1(32)+s1(123)+s1(10)+s1(32)+s1(32)+s1(32)+s1(32)+s1(114)+s1(101)+s1(116)+s1(117)+s1(114)+s1(110)+s1(32)+s1(56)+s1(45)+s1(51)+s1(42)+s1(49)+s1(48)+s1(43)+s1(57)+s1(45)+s1(54)+s1(42)+s1(55)+s1(42)+s1(52)+s1(43)+s1(53)+s1(43)+s1(112)+s1(51)+s1(55)+s1(50)+s1(59)+s1(10)+s1(125)+s1(10)"));
其中js方法名(函数名)通过参数func_name 服务端动态生成,下面一段eval生成对应的函数体。function hEtdqAvW(p372) {
return 8-3*10+9-6*7*4+5+p372;}
函数体也是服务后台动态生成以页面js脚本形式,返回给前端。
在投票提交表单时,通过一个另一个js调这个函数拼接此参数到http报文里。完成一次投票。
此种方法很好防止通过一般程序重复投票,可以阻止绝大部分的人。当然只靠此一种手法还是做不到防止人为刷票,如通过UI自动化手动也可以绕过,当然再加上其他防止刷票手段,就可以防止了。
如果你有对外开放的公共数据服务接口,此种方法也可以防止人为恶意爬取你的数据。对于能操作浏览器内核的人来说,他还是可以绕过。