防刷票方案
2016-02-06 22:37
239 查看
APP里有一个功能是用户上传图片以后,让其他人来投票,最后得票最多的可以得到某种奖励。最近发现了几次刷票的情况,本文总结一下处理的方法
相反,如果限制登录才能投的话,刷票就很困难了,服务端可以很容易地控制刷票行为
在app里可以用IDFA或者device_id作为唯一标识。同时我们也提供了web版的拉票页面,可以考虑用cookie来作为唯一标识,虽然不太稳定,也可以基本上达到目的
在app里可以用文件保存住,web里也可以用local storage实现。全过程不需要服务端参与,是一个比较理想的方案
缺点是local storage有一定的兼容性问题,在比较老的android手机上会有问题。另外如果服务端的接口完全不做保护的话,作弊的人可以通过直接调接口的方式,绕过客户端逻辑实现刷票
有一种方法是给接口增加2个参数,random和key,调用的URL类似:
random是某种随机数,比如跟时间相关的随机数,然后根据某种算法,可以从random算出key。这种算法在客户端和服务端是一致的,这样接口每次被调用的时候,可以检查一下random和key是否正确,拒绝掉错误的请求
通过这种保护,基本上可以过滤掉简单的重复调用。当然也不是绝对安全的,因为这个算法在客户端,特别是web里,从javascript里就可以分析得到
其它的保护比较针对IP的保护,针对agent的保护等等,类似一些反爬虫的策略,本文就不继续展开了
投票无需登录
基本的规则是投票无需登录,因为如果需要登录了才能投票的话,会影响活动的传播效率。所以规则设置为任何人都可以投票,这就给拉票行为留下了隐患相反,如果限制登录才能投的话,刷票就很困难了,服务端可以很容易地控制刷票行为
在服务端控制的方案
所以既然不能用account_id这个天然的唯一标识,就需要找到另一个可以唯一标识终端的标记在app里可以用IDFA或者device_id作为唯一标识。同时我们也提供了web版的拉票页面,可以考虑用cookie来作为唯一标识,虽然不太稳定,也可以基本上达到目的
在客户端控制的方案
另一种方案是在客户端做控制,每次客户端投票以后,都把投过的票的id记下来,然后屏蔽掉重复操作在app里可以用文件保存住,web里也可以用local storage实现。全过程不需要服务端参与,是一个比较理想的方案
缺点是local storage有一定的兼容性问题,在比较老的android手机上会有问题。另外如果服务端的接口完全不做保护的话,作弊的人可以通过直接调接口的方式,绕过客户端逻辑实现刷票
给服务端接口增加保护
通过上述的方法,基本上可以保证通过客户端正常操作的用户无法刷票,但是无法应对直接调用接口的场景,所以还需要对接口本身进行保护有一种方法是给接口增加2个参数,random和key,调用的URL类似:
http://api.xxx.com/vapi/vote?random=111&key=222
random是某种随机数,比如跟时间相关的随机数,然后根据某种算法,可以从random算出key。这种算法在客户端和服务端是一致的,这样接口每次被调用的时候,可以检查一下random和key是否正确,拒绝掉错误的请求
通过这种保护,基本上可以过滤掉简单的重复调用。当然也不是绝对安全的,因为这个算法在客户端,特别是web里,从javascript里就可以分析得到
其它的保护比较针对IP的保护,针对agent的保护等等,类似一些反爬虫的策略,本文就不继续展开了
相关文章推荐
- swift学习笔记之-枚举
- mysql获取更新日期为前一天的数据
- 抓取第三方网站数据
- axure笔记--内部框架交互链接
- 查看静态链接库内容
- 搜索(广度优先搜索)BFS 2
- 用rsync同步文件夹
- 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)(难死了!!)
- BestCoder #71 KK's Number题解
- 在O(logn)时间内找到数组中离每个数最近而又比它大的数的下标
- nyoj--635--Oh, my goddess(dfs)
- javascript几个知识点
- 第十五天
- nyoj--635--Oh, my goddess(dfs)
- [BZOJ2527][Poi2011]Meteors
- win10 下runtime error 解决办法
- 在 java web 中调用存储过程
- 记CentOS 7环境下安装g++
- CentOS 6 安装在虚拟机上 eth0网卡无法工作的解决
- 按钮权限分配