刷票行為
,一直以來都是個難題,無法從根本上防止。但是我們可以盡量減少刷票的傷害,比如:通過人為增加的邏輯限制。
基于 php
,下面介紹防刷票的一些技巧:
$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-
驗證碼
:采用非常復(fù)雜的驗證碼確切的說驗證碼的出現(xiàn)不是針對于人,而是針對于機(jī)器。通過復(fù)雜度和識別難易度的控制來阻攔掉一部分刷票機(jī),從而減少刷票的發(fā)生。但隨著軟件技術(shù)、識別技術(shù)的發(fā)展越來越多的驗證碼面對著先進(jìn)的刷票軟件也失去了其防范的作用、但是專業(yè)刷票機(jī)可以攻破。如果不用驗證碼,投票基本就歇菜了,驗證碼獲取方式,采用異步加載,即點擊輸入框時,才去請求,投票成功后,刪除驗證碼的 session
限時投票
比如:從早8點至晚23 點
投票間隔
用戶投票后,需要隔多長時間才能繼續(xù)投。很多投票站點基本上都有這個限制,但是對于更改 IP的攻擊,就沒辦法了
投票結(jié)果展示
:延遲展示,友好展示頁面上投票,JS 立馬加1,但是刷新頁面,不一定立馬展示最新投票結(jié)果,返回狀態(tài)給頁面(感謝您的投票!或者 投票成功!至于有沒有成功,另說了!)
扣量邏輯
:常見于一些軟件評選之類的投票Cookie
:常用的手段。比較低級加密選項 ID
:對一些投票選項的ID,進(jìn)行隨機(jī)加密可以使用這三個模塊來限制,不過這不是一個好的解決方法
具體可以參見:關(guān)于nginx的限速模塊
通過日志中的一些特征來封鎖ip
cat access.log | grep 'Mozilla/5.0' | awk '{
限制連接
#60秒10個新連接,超過丟棄數(shù)據(jù)包/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#限制與80端口連接的IP最大連接數(shù)為10/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#防止ping洪水攻擊,限制每秒的ping包不超過10個/sbin/iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT #防止各種端口掃描,將SYN及ACK SYN限制為每秒鐘不超過200個,免得把數(shù)務(wù)器帶寬耗盡了/sbin/iptables -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m limit --limit 20/s --limit-burst 200 -j ACCEPT#拒絕ping請求或者net.ipv4.icmp_echo_ignore_all = 1
具體腳本
#!/bin/bash# Date: 2015-09-29# # Author: [email protected] -s -o nounsetexport PATH=/usr/bin/:/biniptables_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 REJECTwhile [ 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} donedone
新聞熱點
疑難解答