刷票行为,一直以来都是个难题,没法从根本上防止。php
可是咱们能够尽可能减小刷票的伤害,好比:经过人为增长的逻辑限制。nginx
基于 PHP,下面介绍防刷票的一些技巧:web
一、使用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);bash
二、验证码:采用很是复杂的验证码服务器
确切的说验证码的出现不是针对于人,而是针对于机器。经过复杂度和识别难易度的控制来阻拦掉一部分刷票机,从而减小刷票的发生。但随着软件技术、识别技术的发展愈来愈多的验证码面对着先进的刷票软件也失去了其防范的做用、可是专业刷票机能够攻破。若是不用验证码,投票基本就歇菜了,验证码获取方式,采用异步加载,即点击输入框时,才去请求,投票成功后,删除验证码的 Sessioncurl
三、限时投票异步
好比:从早8点至晚23 点tcp
四、设置投票间隔加密
用户投票后,须要隔多长时间才能继续投。
不少投票站点基本上都有这个限制,可是对于更改 IP的攻击,就没办法了
五、投票结果展现:延迟展现,友好展现
页面上投票,JS 立马加1,可是刷新页面,不必定立马展现最新投票结果,返回状态给页面(感谢您的投票!或者 投票成功!至于有没有成功,另说了!)
六、扣量逻辑:常见于一些软件评选之类的投票
这是个杀手锏,后台跑脚本实时监控异常增加(刷票)的项,而后实施扣量逻辑
即对于这个项,投 10 票才算一票
七、Cookie:经常使用的手段。比较低级
投票后,在客户端写入 Cookie,下次投票时判断 Cookie 是否存在
可是,这种方式很是容易攻破,由于 Cookie 可删除
八、加密选项 ID:对一些投票选项的ID,进行随机加密
加密算法,加Salt,而且设置有效时间,好比5分钟内
服务器端进行解密而且验证
九、nginx限制连接数
ngx_http_limit_conn_module
ngx_http_limit_req_module
nginx_limit_speed_module
能够使用这三个模块来限制,不过这不是一个好的解决方法
十、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
具体脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/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
|