Web 網頁爬蟲對抗指南 Part.2
不要對外暴露你的API,端點以及類似的東西:
確保你不會向外暴露任何API,甚至無意中的暴露。例如,如果你使用Adobe Flash或Java Applets(禁止執行)中的AJAX或網路請求來載入數據,那麼查看網頁上的網路請求並確定這些請求將在哪裡進行,這都是一些微不足道的小事情,爬蟲程序中會通過逆向工程使用這些端點。確保你模糊混淆了你的端點,使他們難以使別人使用,如上所述。
阻止HTML解析器和爬蟲
由於HTML解析器可以通過從HTML中的可識別模式中提取內容,因此我們可以有意地改變這些模式來達到破壞這些爬蟲的目的,甚至徹底讓它們歇菜。大多數這些技巧也適用於其他爬蟲,如網路蜘蛛和屏幕爬蟲。
經常更改你的HTML內容
爬蟲通過從HTML頁面的特定的可識別部分提取內容,可以直接處理HTML。例如:如果你網站上的所有頁面都有一個id 為article-content的div,其中包含了文章的文本,那麼編寫一個腳本訪問你網站上的所有文章頁面就很簡單,並在每個文章頁面提取id為article-content的div 的內容文本,爬蟲就擁有了你的網站上的所有可以在其他地方重複使用的格式的文章。
如果你經常更改HTML和頁面結構,則這種爬蟲將無法工作。
· 你可以經常更改HTML中的id和class元素,甚至可以自動更改。所以,如果你div.article-content變成了這樣的事情div.a4c36dda13eaf0,並且每周都會有變化,那麼爬蟲最初可以正常工作,但是一周之後就會歇菜。確保更改id / classe的長度,否則爬蟲會通過div.[any-14-characters]來找到所需的div。小心別留下其他類似的「bug」。
· 如果沒有辦法從標記中找到所需的內容,則爬蟲將按照HTML的結構方式執行此操作。所以,如果你所有的文章頁面的相似之處是每個div內的div後的h1是文章內容,爬蟲將獲得基於這樣的文章內容。為了突破這一點,你可以定期和隨機地添加/刪除額外的標記,例如。添加額外的div或span。使用現代伺服器端HTML處理,這應該不是很難。
需要注意的事項:
· 執行,維護和調試會比較乏味。
· 你會阻礙緩存。特別是如果你更改了HTML元素的id或類,這將需要你的CSS和JavaScript文件做出相應的更改,這意味著每次更改它們時,都必須通過瀏覽器重新下載。這將導致重複訪問者的頁面載入時間更長,並增加伺服器負載。如果你每周只更改一次,這不是一個大問題。
· 聰明的爬蟲仍然可以通過推斷實際內容的位置來獲取你的內容,例如。通過知道頁面上的一大塊文本可能是實際的文章。這使得可以從頁面中找到並提取所需的數據。 Boilerpipe 正是這樣做的。
另外請參閱如何阻止根據XPath的抓取工具獲取頁面內容,以獲取有關如何在PHP中實現的詳細信息。
根據用戶的位置更改HTML
這與前一個提示比較類似。如果你根據用戶的位置/國家/地區(由IP地址確定)提供不同的HTML,則可能會影響爬蟲的效率。例如,如果有人正在撰寫一個從你的網站上刪除數據的移動應用程序,那麼它最初可以正常工作,但是當實際分配給用戶時就會中斷,因為這些用戶可能位於不同的國家,從而獲得不同的HTML嵌入式爬蟲不是設計消費的。
經常更改HTML,通過這樣做主動幹掉爬蟲!
看一個例子:如果你的網站上有一個搜索功能,位於http://example.com/search?query=somesearchquery,它返回以下HTML:
<div class="search-result">n <h3 class="search-result-title">Stack Overflow has become the worlds most popular programming Q & A website</h3>n <p class="search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>n <a class"search-result-link" href="/stories/stack-overflow-has-become-the-most-popular">Read more</a>n</div>n
(等等,更多相同結構的div與搜索結果)
你可能已經猜到這很容易被爬蟲突破:所有的爬蟲需要做的就是用查詢點擊搜索URL,並從返回的HTML中提取所需的數據。除了如上所述定期更改HTML之外,你還可以將舊標記與舊的id和類放在一起,用CSS隱藏,並填寫假數據,從而使爬蟲誤以為爬到了數據。以下是更改搜索結果頁面的方法:
<div class="the-real-search-result">n <h3 class="the-real-search-result-title">Stack Overflow has become the worlds most popular programming Q & A website</h3>n <p class="the-real-search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>n <a class"the-real-search-result-link" href="/stories/stack-overflow-has-become-the-most-popular">Read more</a>n</div>n n<div class="search-result" stylex="display:none">n <h3 class="search-result-title">Visit example.com now, for all the latest Stack Overflow related news !</h3>n <p class="search-result-excerpt">EXAMPLE.COM IS SO AWESOME, VISIT NOW! (Real users of your site will never see this, only the scrapers will.)</p>n <a class"search-result-link" href="http://example.com/">Visit Now !</a>n</div>n
(更多的真實搜索結果)
這將意味著根據類或ID從HTML中提取數據的爬蟲將繼續看起來很有效,但是由於隱藏了CSS,因此它們將獲得假數據,甚至是真實用戶永遠不會看到的數據。
將假的,不可見的蜜罐數據插入到你的頁面
在上一個示例中添加內容,你可以添加隱藏的蜜罐項目到你的HTML頁面。可以添加到先前描述的搜索結果頁面的示例:
<div class="search-result" stylex="display:none">n <h3 class="search-result-title">This search result is here to prevent scraping</h3>n <p class="search-result-excerpt">If youre a human and see this, please ignore it. If youre a scraper, please click the link below ??n Note that clicking the link below will block access to this site for 24 hours.</p>n <a class"search-result-link" href="/scrapertrap/scrapertrap.php">Im a scraper !</a>n</div>n
獲取所有搜索結果的爬蟲會選擇這種做法,就像頁面上的其他真實搜索結果一樣,然後訪問鏈接,查找所需的內容。一個真實的用戶永遠不會在第一個地方看到(由於它被CSS隱藏)內容,所以不會訪問鏈接。真實的網路蜘蛛(如Google)也不會訪問該鏈接,因為你在robots.txt中(不要忘記這一點!)配置了不允許/scrapertrap/被爬取。
你可以在scrapertrap.php中為訪問它的IP地址做一些阻止訪問的操作,或強制對該IP所有後續請求進行驗證。
· 不要忘記在你的robots.txt文件中禁止/scrapertrap/,這樣搜索引擎的機器人就不會爬取它。
· 你可以將此建議與之前提到的經常更改HTML的建議相結合。
· 經常改變這種變換方法,因為爬蟲最終會學會突破限制。更改蜜罐網址和文字。還要考慮更改用於隱藏的內聯CSS,並使用ID屬性和外部CSS替代,因為scraper將學習避免任何style具有CSS屬性用於隱藏內容的內容。
· 請注意,惡意人員可以在論壇(或其他地方)上發布[img]http://yoursite.com/scrapertrap/scrapertrap.php[img]的內容,因此用戶訪問該論壇時會發生DOS攻擊,瀏覽器會點擊你的蜜罐網址。因此,更改URL的前一個提示是重要的,你還可以查看引用者。
如果你檢測到爬蟲,請提供假的和無用的數據
如果你發現有些請求顯然是一個爬蟲,你可以提供假的和無用的數據; 這將影響爬蟲從你的網站獲得的數據。你也應該注意不要將這些假數據與實際數據區分開來,這樣爬蟲就不知道他們被戲耍了。
舉個例子:如果你有個新聞網站; 如果你檢測到爬蟲,而不是阻止訪問,只需提供假的,隨機生成的文章,這將使爬蟲獲得中毒的數據。如果你把你偽造的數據或文章與真實的東西區分開來,那麼爬蟲就很難得到他們想要的東西,即實際的真實文章。
如果User Agent為空,則不接受請求
通常,懶惰的爬蟲製作者不會發送User Agent頭部的請求,而所有的瀏覽器以及搜索引擎的蜘蛛都會發送。
如果你收到User Agent頭不存在的請求,你可以顯示驗證碼,或者只是阻止或限制訪問。(或者如上所述提供虛假的數據,或其他內容)
欺騙也不是一定可以起作用,但作為一種措施來防止寫得不好的爬蟲,這是值得做的事情。
如果User Agent是普通的爬蟲,不接受請求; 爬蟲使用黑名單過濾
在某些情況下,爬蟲將使用沒有真正的瀏覽器或搜索引擎蜘蛛使用的User Agent,例如:
· 「Mozilla」(就是這樣,沒有別的,我看到過幾個關於這個的問題,真正的瀏覽器永遠不會使用這種UA)
· 「Java 1.7.43_u43」(默認情況下,Java的HttpUrlConnection使用的是像這樣的東西。)
· 「BIZCO EasyScraping Studio 2.0」
· 「wget」,「curl」,「libcurl」,..(Wget和cURL有時用於基本的Web 爬蟲)
如果你發現網站上的爬蟲使用了特定的User Agent字元串,並且它不被真正的瀏覽器或合法的網路蜘蛛使用,你還可以將其添加到你的黑名單中。
檢查Referer頭
可以將此方法添加到上一個項目中,你還可以檢查[Referer](https://en.wikipedia.org/wiki/HTTP_referer)(是的,它是Referer,而不是推薦來源),因為懶惰的爬蟲製作者可能不會發送這個HTTP頭 ,或者總是發送相同的東西(有時候是「google.com」)。例如,如果用戶來自搜索結果頁面的文章頁面,請檢查Referer頭是否存在,並指向該搜索結果頁面。
當心:
· 真正的瀏覽器並不總是發送它;
· 欺騙是微不足道的。
作為一個補充措施,防止寫得不好的爬蟲可能值得實施此方案。
如果不請求資產(CSS,圖片),它不是一個真正的瀏覽器。
一個真正的瀏覽器將(幾乎總是)請求和下載資源,如圖像和CSS。HTML解析器和爬蟲不會僅僅對實際頁面及其內容感興趣。
你可以將請求記錄到資產中,如果你只看到HTML的許多請求,那麼它可能是一個爬蟲。
請注意,搜索引擎機器人,舊的移動設備,屏幕閱讀器和配置錯誤的設備可能也不會請求資產文件。
使用和要求cookies; 使用它們來跟蹤用戶和爬蟲操作。
你可以要求啟用cookies以查看你的網站。這將阻止沒有經驗的和新手的爬蟲製作者,但是爬蟲可以很容易地發送cookie。如果你確實使用並要求使用它們,則可以跟蹤用戶和爬蟲操作,從而在每個用戶而不是每個IP的基礎上實施限速,阻止或顯示驗證碼。
例如:當用戶執行搜索時,設置唯一的標識cookie。查看結果頁時,請驗證該Cookie。如果用戶打開所有的搜索結果(你可以從cookie中得知),那麼它可能是一個爬蟲。
使用Cookie可能無效,因為爬蟲也可以發送Cookie,並根據需要丟棄它們。如果你的網站僅適用於Cookie,你還將阻止訪問cookies的用戶。
請注意,如果你使用JavaScript設置和檢索Cookie,則會阻止不運行JavaScript的爬蟲,因為它們無法檢索並發送Cookie。
使用JavaScript + Ajax載入你的內容
你可以在頁面本身載入後使用JavaScript + AJAX載入你的內容。這將使內容在不能運行JavaScript的HTML解析器正常渲染最終無法訪問。這對於新手和沒有經驗的程序員撰寫的爬蟲通常是一個有效的阻止方法。
有以下幾點要注意:
· 使用JavaScript載入實際的內容將降低用戶體驗和性能
· 搜索引擎也可能不會運行JavaScript,從而阻止他們索引你的內容。這可能不是搜索結果頁面的問題,但可能是其他的東西,如文章頁面。
· 知道他們正在做什麼樣的爬蟲的程序員可以編寫一個能夠發現內容載入的端點並使用它們。
模糊你的標記,來自腳本的網路請求以及其他所有內容。
如果你使用Ajax和JavaScript載入數據,則需要混淆傳輸的數據。例如,你可以在伺服器上對數據進行編碼(具有簡單的base64或更複雜的多層混淆,位移或甚至加密),然後在獲取後將其解碼並在客戶端上通過Ajax顯示。這意味著有人檢查網路流量將不會立即看到你的頁面如何工作和載入數據,並且對於某人直接從你的端點請求數據時會更加困難,因為它們將不得不對你的干擾演算法進行逆向工程。
· 如果你使用Ajax來載入數據,則應該很難使用端點,而不是首先載入頁面,例如通過要求一些會話密鑰作為參數,你可以將其嵌入到JavaScript或HTML中。
· 你還可以將混淆的數據直接嵌入到初始HTML頁面中,並使用JavaScript對其進行混淆和顯示,從而避免額外的網路請求。這樣做會使得使用不運行JavaScript的僅HTML分析器來提取數據變得更加困難,因為編寫爬蟲的那些資料庫必須對JavaScript進行逆向工程(你也應該混淆)。
· 你可能需要定期更改你的混淆方法,以打破已經弄清楚的爬蟲。
儘管如此,做這樣的事情有下面幾個缺點:
· 執行,維護和調試將是乏味的。
· 對於實際運行JavaScript,然後提取數據的爬蟲和屏幕截圖將無效。(最簡單的HTML解析器不會運行JavaScript)
· 如果禁用JavaScript,這將使你的站點對真實用戶無效。
· 性能和頁面載入時間將受到影響。
非技術:
你的主機提供商可能會提供機器人和爬蟲保護:
例如,CloudFlare提供了一個防bot和防爬保護,你只需要啟用它,AWS也是如此。還有一個mod_evasive,一個Apache模塊,讓你輕鬆實現速率限制。
告訴別人不要非法爬取數據,有些人會尊重它
你應該告訴別人不要爬你的網站,例如 在你的條件或服務條款。有些人實際上會尊重這一點,而且未經許可不得從你的網站上刪除數據。
找律師
他們知道如何處理侵犯版權,並可以發出停止信件。數字千年版權法案DMCA,這種方法是Stack Overflow和Stack Exchange使用的方法。
使你的數據可用,提供API:
這可能看起來適得其反,但你可以使你的數據容易獲得,並且需要歸因和鏈接返回到你的網站。也許甚至收取$$$
其他說明:
· 找到真正用戶的可用性和爬蟲保護之間的平衡:你所做的一切都會以某種方式對用戶體驗產生負面影響,因此你需要找到妥協的辦法。
· 不要忘了你的移動網站和應用程序:如果你有一個移動版本的網站,請注意爬蟲也可以爬Web頁面。如果你有移動應用程序,那麼也可以通過屏幕截圖爬取,並且可以檢查網路流量以確定其使用的REST端點。
· 如果你為特定瀏覽器提供特殊版本的網站,例如 舊版Internet Explorer的縮減版本,不要忘記爬蟲也可以爬取這種Web頁面。
· 結合使用這些技巧,挑選最適合你的技巧。
· 爬蟲可以爬取其他爬蟲的結果:如果有一個網站顯示從你的網站上爬取的內容,其他爬蟲則可以從爬蟲的網站上爬取下來。
最有效的方法是什麼?
根據我在這裡撰寫爬蟲和幫助人們寫下反爬蟲的經驗,最有效的方法如下:
· 經常更改HTML標記
· 使用蜜罐和假數據
· 使用模糊的JavaScript,AJAX和Cookies
· 速率限制和爬蟲檢測和隨後的阻塞。
本文翻譯自:https://github.com/JonasCz/How-To-Prevent-Scraping/blob/master/README.md ,如若轉載,請註明原文地址: http://www.4hou.com/web/8736.html 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※使用LuaQEMU對BCM WiFi框架進行模擬和利用
※CouchDB 的遠程代碼執行漏洞淺析
※比「壞兔子」更可怕,數千網站正被惡意利用
※Neat tricks to bypass CSRF-protection
TAG:信息安全 |