防刷票方案

vote
美甲大咖有一个功能是用户上传图片以后,让其他人来投票,最后得票最多的可以得到奖励。最近发现居然有用户在刷票,本文总结一下处理的方法

投票无需登录

活动基本规则是投票无需登录,因为如果需要登录了才能投票的话,会影响活动的传播效率。所以规则设置为任何人都可以投票,这就给拉票行为留下了隐患

相反,如果限制登录才能投的话,刷票就很困难了,服务端可以很容易地控制刷票行为

在服务端控制的方案

所以既然不能用account_id这个天然的唯一标识,就需要找到另一个可以唯一标识终端的标记

在app里可以用IDFA或者device_id作为唯一标识。同时我们也提供了web版的拉票页面,可以考虑用cookie来作为唯一标识,虽然不太稳定,也可以基本上达到目的

在客户端控制的方案

另一种方案是在客户端做控制,每次客户端投票以后,都把投过的票的id记下来,然后屏蔽掉重复操作

在app里可以用文件保存住,web里也可以用local storage实现。全过程不需要服务端参与,是一个比较理想的方案

缺点是local storage有一定的兼容性问题,在比较老的android手机上会有问题。另外如果服务端的接口完全不做保护的话,作弊的人可以通过直接调接口的方式,绕过客户端逻辑实现刷票

给服务端接口增加保护

通过上述的方法,基本上可以保证通过客户端正常操作的用户无法刷票,但是无法应对直接调用接口的场景,所以还需要对接口本身进行保护

有一种方法是给接口增加2个参数,random和key,调用的URL类似:

1
http://api.xxx.com/vapi/vote?random=111&key=222

random是某种随机数,比如跟时间相关的随机数,然后根据某种算法,可以从random算出key。这种算法在客户端和服务端是一致的,这样接口每次被调用的时候,可以检查一下random和key是否正确,拒绝掉错误的请求

通过这种保护,基本上可以过滤掉简单的重复调用。当然也不是绝对安全的,因为这个算法在客户端,特别是web里,从javascript里就可以分析得到

其它的保护比较针对IP的保护,针对agent的保护等等,类似一些反爬虫的策略,本文就不继续展开了