關於反爬蟲和惡意攻擊的一些策略和思路

    前段時間Guang.com常常受到惡意spider攻擊,瘋狂抓取網站內容,一系列機器人spam發廣告,對網站性能有較大影響。html

        下面我說說一些反惡意spiderspam的策略和思路。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 和正常spiderbaidugoogle...)瀏覽器

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的攻擊,保證網站正常運行。

相關文章
相關標籤/搜索