前段時間Guang.com常常受到惡意spider攻擊,瘋狂抓取網站內容,一系列機器人spam發廣告,對網站性能有較大影響。html
下面我說說一些反惡意spider和spam的策略和思路。python
1. 經過日誌分析來識別惡意爬蟲/攻擊redis
less guang.com_access.log | awk -F- '{print $1}' | sort | uniq -c | sort -rn | head -n 50
首先分析access log,類聚統計出訪問量前50 IP
shell
排除白名單IP 和正常spider(baidu,google...)瀏覽器
host 112.94.32.135 //查看可疑ip是否是baidu、google等常規爬蟲。
分析能夠ip 請求時間、頻率、路徑等,你能夠很容易發現這是不是一個spider,下面那明顯是一個spider。服務器
less access.log | grep '112.94.32.135' | less 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1888476 HTTP/1.1" 200 107876 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1922742 HTTP/1.1" 200 110053 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437104 HTTP/1.1" 200 10751 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1733527 HTTP/1.1" 200 98099 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437105 HTTP/1.1" 200 10891 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /baobei/1646377 HTTP/1.1" 200 95527 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:50 +0800] "GET /u/1437106 HTTP/1.1" 200 10681 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1922741 HTTP/1.1" 200 98356 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1733526 HTTP/1.1" 200 97690 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /u/1437107 HTTP/1.1" 200 10765 "-" "Mozilla/4.0" 112.94.32.135 - - [1/Oct/2012:00:00:51 +0800] "GET /baobei/1888475 HTTP/1.1" 200 96415 "-" "Mozilla/4.0"
既然發現spider,固然要動用iptables來封殺這IP, 但不少時候僅僅封一個IP是不夠的,由於通常爬蟲都是運行在託管機房裏面(多臺服務器輪換)或者家裏ADSL(從新撥號換IP),因此封整個C網段會直接有效得多,固然這樣作有可能影響極小數正經常使用戶訪問,因此建議一段時間後從新解封這c網段。session
iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 112.94.32.0/24
以上能夠寫成個shell/python腳本,天天執行一次。less
2. 實時反爬蟲tcp
通過日誌分析來識別惡意爬蟲/攻擊,沒法即時屏蔽這些spider,對網站影響仍是在的。再說,假若有人採用分佈式的spider(幾百個代理服務器一塊兒過 來爬),網站頗有可能沒法訪問,分析日誌也不能及時解決問題。必須採起實時反爬蟲策略,實時識別和封鎖惡意爬蟲的訪問。分佈式
實現思路:用redis來記錄每一個IP的訪問頻度,在單位時間以內,若是訪問頻率超過一個閥值,就認爲這個IP頗有可疑,而後就能夠返回一個驗證碼頁面,要求用戶填寫驗證碼。若是是爬蟲的話,固然不可能填寫驗證碼,若是該IP地址短期內繼續不停的請求,則判斷爲爬蟲,加入黑名單。
固然判斷這IP是否可疑,單單從訪問頻率來判斷是不夠的,還須要增長如下策略:
分析referer。通常爬蟲的referer 都是爲空或者一個固定值。
分析訪問時間間隔。通常爬蟲爬取網頁的頻率都是比較固定的,不像人去訪問網頁,間隔時間比較無規則。
排除白名單IP地址段。
具體redis操做:
//score 爲timestamp, value 爲{referer}{request_url}{sessionId} redis> ZADD log:ip:112.94.32.135 61307510400000 "{referer}{request_url}{sessionId}" (integer) 1 //保留1個小時內log會比較合理。 redis> ZREMRANGEBYSCORE log:ip:112.94.32.135 -inf {timestamp} (integer) 1 redis> ZRANGE log:ip:112.94.32.135 0 -1
更多Redis 的應用場景,請看Redis 在電商中的實際應用場景
後記
有同窗說,還能夠根據User-Agent來屏蔽spider,但我認爲這沒什麼意義,如今的惡意spider都已經將User-Agent假裝成普通瀏覽器或者正規爬蟲的User-Agent了,我也再也不這裏提了。
我認爲,結合以上2種策略,能夠很大程度打擊那些惡意spider的攻擊,保證網站正常運行。