刷票行爲,一直以來都是個難題,沒法從根本上防止。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
|