素材牛VIP会员
关于一个投票系统的问题,如何防止刷票
 贝***0  分类:PHP代码  人气:2075  回帖:19  发布于6年前 收藏

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

 标签:javascriptphp

讨论这个帖子(19)垃圾回帖将一律封号处理……

Lv5 码农
超***侠 Web前端工程师 6年前#1

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

Lv4 码徒
23***om JS工程师 6年前#2

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

Lv7 码师
ph***16 JAVA开发工程师 6年前#3

我也觉得,要想完全防止刷票,是不可能的,我们能做的,只是尽量增加刷票方的成本,从而让他的付出大于刷票得到的成果,他自然而然就退却了!
除了ip、复杂验证码这些,我倒是比较推崇用户行为作为判断是否刷票的依据,再结合上面大家说的这些,能增加刷票的难度。
比如通过记录用户进入网站的过程,滚动条滚动到什么位置,鼠标在什么地方悬停多久,鼠标在什么地点击过,有无浏览其他页面,其他页面鼠标和滚动条的动作,都记录下来,判断符合正常人为投票的逻辑才能在票数上加1.

Lv5 码农
wz***16 技术总监 6年前#4

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

Lv6 码匠
99***99 其它 6年前#5

投一票支付10元就可以了

Lv6 码匠
lk***29 CEO 6年前#6

设备唯一ID 能得到就ok了~

Lv5 码农
超***侠 Web前端工程师 6年前#7

这个确实不容易,假投票主要来自于:

  1. 机器人:这个基本还是需要靠验证码。机器难以识别的验证码人也不容易识别,但似乎也没有更好的办法。
    2.水军:这个需要分析用户行为,把水军账号找出来

Lv6 码匠
小***心 站长 6年前#8

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

Lv6 码匠
素***2 学生 6年前#9

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

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

基于 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
Lv5 码农
鸭***咬 Web前端工程师 6年前#10

应该不会有人专门为了你这次投票而制作一个刷票机,那样的话成本会比较高的。

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取