javascript - 关于一个投票系统的问题,如何防止刷票
伊谢尔伦
伊谢尔伦 2017-04-10 16:42:53
[JavaScript讨论组]

像验证手机号的代价太大,咱就不说了;像验证码这样的,如何设置最好;还有没有其他更加有效的方式?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(19)
高洛峰

我就直说吧:放弃你的幻想。没有任何方式是必然有效的。

一切防刷的努力都能被破解,只要肯花钱。以我接触过的一些价格举例:

  • 识别设备的特征:这个毕竟是客户端上报的数据,所以随便伪造,无需花钱

  • 电子邮箱:这个几乎是免费的

  • QQ号:信封号洗号后直售。0.15--0.50元/个不等

  • 微信:号池养号出租。0.50--3.00元/个不等

  • IP:肉鸡池或代理服务器集群出租。0.50--10.00元/时不等

  • 短信接收验证:猫池养卡代收。0.05--0.30元/次不等 另外唯有这个同时消耗防守方的资金

  • 短信发送验证:猫池养卡代发。0.20--0.80元/次不等

  • 传统验证码:图像识别。0.10--0.30元/个不等

  • 复杂验证码:人工打号。0.20--0.80元/个不等(这个一般作为图像识别失败时的补充)

  • 同时还有自动点击脚本的定制服务,100--3000元/每套不等,可能要配合使用上边的资源作为消耗品。

(注意:黑产的价格都是模糊、飘忽且各地极其分散的,难有默契或者“行情”。根据个人接触的圈子不同,具体价格不尽准确。)

不要低估互联网黑产这门行业——它远远超出我们一般技术人的想象。

防刷不能靠一门单一的技术,而是要综合分析可能的破解手段,评估攻击者愿意做到什么地步,以和黑产打一场全面战争的角度思考问题。即:如何以最小的消耗,来最大限度的浪费黑产的时间和金钱

而这种问题必然是没有银弹的。所有只提出一种单一手段的答案都该被踩——“技术解决一切”对于某些场合,是一种过于幼稚的幻想,得让现实需求好好削几个耳光治一治。


从这个意义上,单纯的提问这个问题,信息量太少了。具体策略必然需要根据具体的场景而定。例如:

  • 活动做多大规模?

  • 活动有多大利益?

  • 能否估计出可能的攻击者,会投入多大量级的资金?

  • 预计投入多少资金用于防刷技术?

  • 无论如何防刷,刷单损失客观上仍不可避免。那么最高可以容忍多少个百分点?

一般而言,以下的几种方法是比较划算的(即破解这些需要相对多的时间和金钱):

  • IP限制

  • 微信验证

  • 复杂验证码

  • 短信接收

巴扎黑

刷票行为,一直以来都是个难题,无法从根本上防止。

但是我们可以尽量减少刷票的伤害,比如:通过人为增加的逻辑限制。

基于 PHP,下面介绍防刷票的一些技巧:文章链接

1、使用CURL进行信息伪造

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://localhost/2.php");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));
curl_setopt($ch, CURLOPT_REFERER, "http://localhost/ ");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.0)");
$out = curl_exec($ch); 
curl_close($ch);

2、验证码:采用非常复杂的验证码

确切的说验证码的出现不是针对于人,而是针对于机器。通过复杂度和识别难易度的控制来阻拦掉一部分刷票机,从而减少刷票的发生。但随着软件技术、识别技术的发展越来越多的验证码面对着先进的刷票软件也失去了其防范的作用、但是专业刷票机可以攻破。如果不用验证码,投票基本就歇菜了,验证码获取方式,采用异步加载,即点击输入框时,才去请求,投票成功后,删除验证码的 Session

3、限时投票

比如:从早8点至晚23 点

4、设置投票间隔

用户投票后,需要隔多长时间才能继续投。
很多投票站点基本上都有这个限制,但是对于更改 IP的攻击,就没办法了

5、投票结果展示:延迟展示,友好展示

页面上投票,JS 立马加1,但是刷新页面,不一定立马展示最新投票结果,返回状态给页面(感谢您的投票!或者 投票成功!至于有没有成功,另说了!)

6、扣量逻辑:常见于一些软件评选之类的投票

这是个杀手锏,后台跑脚本实时监控异常增长(刷票)的项,然后实施扣量逻辑
即对于这个项,投 10 票才算一票

7、Cookie:常用的手段。比较低级

投票后,在客户端写入 Cookie,下次投票时判断 Cookie 是否存在
但是,这种方式非常容易攻破,因为 Cookie 可删除

8、加密选项 ID:对一些投票选项的ID,进行随机加密

加密算法,加Salt,并且设置有效时间,比如5分钟内
服务器端进行解密并且验证

9、nginx限制链接数

ngx_http_limit_conn_module
ngx_http_limit_req_module
nginx_limit_speed_module

可以使用这三个模块来限制,不过这不是一个好的解决方法

10、iptables限制

/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
/sbin/iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask
 32 -j REJECT

具体脚本

#!/bin/bash
# Date: 2015-09-29
# # Author: cpz@erongtu.com
 
shopt -s -o nounset
export PATH=/usr/bin/:/bin
 
iptables_log="/tmp/iptables_conf.log"
 
/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
/sbin/iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
/sbin/iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT
 
while [ true ]; do
 
    #sleep 1
    for IP in `netstat -an | grep -i ':80 '|grep 'ESTAB' | awk '{print $5}' | cut -d : -f 1 | sort | uniq -c | awk '{if($1 > 30 && $2!="127.0.0.1" ) {print $2}}'`
    do
        /sbin/iptables -L -n  | grep  $IP >/dev/null || /sbin/iptables -A INPUT -p tcp --dport 80 -s $IP -j DROP
        echo "/sbin/iptables -A INPUT -p tcp  -s $IP -j DROP" >> ${iptables_log}
    done
done
PHPz

做微信里不错,用jssdk获取用户的openid,就可以了

天蓬老师

如果没有帐号体系, 那么防止刷票要通过ip来判断,
获取ip得用$_server[remote_addr]来获取用户ip。

PHP中文网

人类已经无法阻止刷票行为了。。现在的人刷票都是加群,各种刷票群,然后各种人互刷。。

PHP中文网

我觉得这不是个技术问题,应该是个产品管理的问题。纯技术手段必须要结合你对这个“投票”的产品的经营策略才能发挥最大效用。就像刚才有人说的,如果你只是把这个产品定义成一个只能完成简单survey功能的(只有几个记录选项然后upload再汇总的功能)简单产品,那你就要添加许许多多的技术手段来保证你这个产品实现你的预期功能(确实反映客观投票结果)。但是如果你提前在设计产品的时候,以结果为导向,把这一块考虑进去,那么你就应该考虑到对用户的过滤是此产品很关键的一环,而不至于等到先把投票功能开发完了,再回过头去考虑“防刷票”,这是本末倒置,说明产品设计流程有问题。

如果你能解决上面我说的问题,就应该一开始就想到,要先过滤用户,再让过滤出来的用户“干什么”(不管是投票还是评论还是别的什么)。所以应该先搞一个准入制度,比如注册,验证,答题激活,推荐激活,间隔日期激活,积分功能激活权限等等手段来尽量拔高门槛,然后再考虑利用这批过滤出来的用户来做什么。这样才是解决这个问题的正确思考顺序。

PHPz

禁止代理,然后用IP限制+复杂验证码限制,对于一般的投票是没问题的。

怪我咯

投一票支付10元就可以了

PHPz

帐号登录投票,一个帐号只能投一次,这样就是不太方便了,得先弄个帐号登录。。。

迷茫

知己知彼,百战百胜

首先弄清用户为啥要刷,刷票对他有啥好处

我们当然会给刷票者设立门槛,但是只要刷票带来的收益大于付出的成本,就会存在刷票的可能性(墨菲定律)。

所以不存在完美的防止刷票的机制,而是根据具体的投票内容设置合适的投票成本。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号