導航:首頁 > 文檔加密 > js簽名加密方法防爬

js簽名加密方法防爬

發布時間:2024-10-21 00:26:53

php如何防止網站內容被採集

1、限制IP地址單位時間的訪問次數
分析:沒有哪個常人一秒鍾內能訪問相同網站5次,除非是程序訪問,而有這種喜好的,就剩下搜索引擎爬蟲和討厭的採集器了。
弊端:一刀切,這同樣會阻止搜索引擎對網站的收錄
適用網站:不太依靠搜索引擎的網站
採集器會怎麼做:減少單位時間的訪問次數,減低採集效率
2、屏蔽ip
分析:通過後台計數器,記錄來訪者ip和訪問頻率,人為分析來訪記錄,屏蔽可疑Ip。
弊端:似乎沒什麼弊端,就是站長忙了點
適用網站:所有網站,且站長能夠知道哪些是google或者網路的機器人
採集器會怎麼做:打游擊戰唄!利用ip代理採集一次換一次,不過會降低採集器的效率和網速(用代理嘛)。
3、利用js加密網頁內容
Note:這個方法我沒接觸過,只是從別處看來
分析:不用分析了,搜索引擎爬蟲和採集器通殺
適用網站:極度討厭搜索引擎和採集器的網站
採集器會這么做:你那麼牛,都豁出去了,他就不來采你了
4、網頁里隱藏網站版權或者一些隨機垃圾文字,這些文字風格寫在css文件中
分析:雖然不能防止採集,但是會讓採集後的內容充滿了你網站的版權說明或者一些垃圾文字,因為一般採集器不會同時採集你的css文件,那些文字沒了風格,就顯示出來了。
適用網站:所有網站
採集器會怎麼做:對於版權文字,好辦,替換掉。對於隨機的垃圾文字,沒辦法,勤快點了。
5、用戶登錄才能訪問網站內容
分析:搜索引擎爬蟲不會對每個這樣類型的網站設計登錄程序。聽說採集器可以針對某個網站設計模擬用戶登錄提交表單行為。
適用網站:極度討厭搜索引擎,且想阻止大部分採集器的網站
採集器會怎麼做:製作擬用戶登錄提交表單行為的模塊

Ⅱ 爬蟲與反爬蟲技術

互聯網的快速進步,離不開爬蟲的貢獻,但同時也潛藏著一些問題,尤其是惡意爬蟲的侵擾。爬蟲是什麼?它是如何獲取數據?如何防止被爬取?本文將深入解析這些問題。

互聯網站點的流量中,30%至60%來源於爬蟲,其中友好爬蟲如搜索引擎、廣告程序等與惡意爬蟲並存。惡意爬蟲對網站業務安全構成威脅,可能竊取核心文本、擾亂市場秩序、降低網站性能。為抵禦惡意爬蟲,出現了反爬蟲技術,分為被動防禦與主動防禦。

被動防禦主要通過檢測HTTP請求頭、封禁訪問頻率過高的IP地址。然而,這種方法存在缺陷,如檢測流程單一、誤判率高等。主動防禦則通過動態變換網頁底層代碼,提升攻擊難度,實現全方位防護。

網路爬蟲獲取數據的基本流程包括解析URL、發送HTTP請求、解析網頁內容等步驟。網路爬蟲架構中,種子URL作為起點,通過讀取、解析、下載、存儲、提取新URL等過程,直至待抓取隊列為空。

基於自定義cookie的檢測策略是主動抵禦惡意爬蟲的一種方式。通過在網站介面中增加加密參數,瀏覽器執行返回的JS代碼生成時效性、機密性cookie。正常用戶與惡意爬蟲的交互過程存在差異,如真實的瀏覽器存在bug,而爬蟲無法生成正確的cookie。此策略結合JavaScript混淆技術,代碼可讀性大幅降低。

JS代碼混淆技術包括變數混淆、字元串混淆、控制流平坦化、無用代碼注入、禁用控制台輸出、調試保護、域名鎖定等。混淆技術可以混淆代碼結構、隱藏明文字元串、增加代碼執行難度,達到保護目的。

JavaScript-obfuscator混淆工具提供代碼混淆功能,輸出壓縮、混淆後的JS代碼,降低可讀性。混淆後代碼結構包含大數組、數組移位、解密函數、核心代碼、無限debugger自執行函數+死代碼注入。混淆強度取決於這四段代碼強度。常用混淆工具有YUI Compressor、Google Closure Compiler、UglifyJS、JScrambler等。

爬蟲與反爬蟲技術在互聯網發展中互相影響。反爬蟲技術正朝著綜合性安全系統發展,以智能交互、實時計算、模型分析等能力應對挑戰。未來,隨著監管加強,爬蟲技術的使用將更加規范,互聯網環境將更加健康。

Ⅲ 如何應付不知名的爬蟲騷擾

一、手工識別和拒絕爬蟲的訪問

有相當多的爬蟲對網站會造成非常高的負載,因此識別爬蟲的來源IP是很容易的事情。最簡單的辦法就是用netstat檢查80埠的連接:
C代碼 netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n netstat -nt | grep youhostip:80 | awk '{print $5}' | awk -F":" '{print $1}'| sort | uniq -c | sort -r -n
這行shell可以按照80埠連接數量對來源IP進行排序,這樣可以直觀的判斷出來網頁爬蟲。一般來說爬蟲的並發連接非常高。

如果使用lighttpd做Web Server,那麼就更簡單了。lighttpd的mod_status提供了非常直觀的並發連接的信息,包括每個連接的來源IP,訪問的URL,連接狀態和連接時間等信息,只要檢查那些處於handle-request狀態的高並發IP就可以很快確定爬蟲的來源IP了。

拒絕爬蟲請求既可以通過內核防火牆來拒絕,也可以在web server拒絕,比方說用iptables拒絕:
C代碼 iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24 iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s 84.80.46.0/24
直接封鎖爬蟲所在的C網段地址。這是因為一般爬蟲都是運行在託管機房裡面,可能在一個C段裡面的多台伺服器上面都有爬蟲,而這個C段不可能是用戶寬頻上網,封鎖C段可以很大程度上解決問題。

有些人提出一種腦殘的觀點,說我要懲罰這些爬蟲。我專門在網頁裡面設計動態循環鏈接頁面,讓爬蟲掉進陷阱,死循環爬不出來,其實根本用不著設置陷阱,弱智爬蟲對正常網頁自己就爬不出來,這樣做多此一舉不說,而且會讓真正的搜索引擎降低你的網頁排名。而且運行一個爬蟲根本不消耗什麼機器資源,相反,真正寶貴的是你的伺服器CPU資源和伺服器帶寬,簡單的拒絕掉爬蟲的請求是反爬蟲最有效的策略。

二、通過識別爬蟲的User-Agent信息來拒絕爬蟲

有很多爬蟲並不會以很高的並發連接爬取,一般不容易暴露自己;有些爬蟲的來源IP分布很廣,很難簡單的通過封鎖IP段地址來解決問題;另外還有很多各種各樣的小爬蟲,它們在嘗試Google以外創新的搜索方式,每個爬蟲每天爬取幾萬的網頁,幾十個爬蟲加起來每天就能消耗掉上百萬動態請求的資源,由於每個小爬蟲單獨的爬取量都很低,所以你很難把它從每天海量的訪問IP地址當中把它准確的挖出來。

這種情況下我們可以通過爬蟲的User-Agent信息來識別。每個爬蟲在爬取網頁的時候,會聲明自己的User-Agent信息,因此我們就可以通過記錄和分析User-Agent信息來挖掘和封鎖爬蟲。我們需要記錄每個請求的User-Agent信息,對於Rails來說我們可以簡單的在app/controllers/application.rb裡面添加一個全局的before_filter,來記錄每個請求的User-Agent信息:
Ruby代碼 logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}" logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}"

然後統計每天的proction.log,抽取User-Agent信息,找出訪問量最大的那些User-Agent。要注意的是我們只關注那些爬蟲的User-Agent信息,而不是真正瀏覽器User-Agent,所以還要排除掉瀏覽器User-Agent,要做到這一點僅僅需要一行shell:
Ruby代碼 grep HTTP_USER_AGENT proction.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko' | sort | uniq -c | sort -r -n | head -n 100 > bot.log grep HTTP_USER_AGENT proction.log | grep -v -E 'MSIE|Firefox|Chrome|Opera|Safari|Gecko' | sort | uniq -c | sort -r -n | head -n 100 > bot.log

統計結果類似這樣:
C代碼 57335 HTTP_USER_AGENT Baispider+(+ http://www..com/search/spider.htm)56639 HTTP_USER_AGENT Mozilla/5.0 (compatible; Googlebot/2.1; + http://www.google.com/bot.html)42610 HTTP_USER_AGENT Mediapartners-Google 19131 HTTP_USER_AGENT msnbot/2.0b (+ http://search.msn.com/msnbot.htm)57335 HTTP_USER_AGENT Baispider+(+ http://www..com/search/spider.htm) 56639 HTTP_USER_AGENT Mozilla/5.0 (compatible; Googlebot/2.1; + http://www.google.com/bot.html) 42610 HTTP_USER_AGENT Mediapartners-Google 19131 HTTP_USER_AGENT msnbot/2.0b (+ http://search.msn.com/msnbot.htm)

從日誌就可以直觀的看出每個爬蟲的請求次數。要根據User-Agent信息來封鎖爬蟲是件很容易的事情,lighttpd配置如下:
C代碼 $HTTP["useragent"] =~ "qihoobot|^Java|Commons-HttpClient|Wget|^PHP|Ruby|Python" { url.rewrite = ( "^/(.*)" => "/crawler.html" ) } $HTTP["useragent"] =~ "qihoobot|^Java|Commons-HttpClient|Wget|^PHP|Ruby|Python" { url.rewrite = ( "^/(.*)" => "/crawler.html" ) }

使用這種方式來封鎖爬蟲雖然簡單但是非常有效,除了封鎖特定的爬蟲,還可以封鎖常用的編程語言和HTTP類庫的User-Agent信息,這樣就可以避免很多無謂的程序員用來練手的爬蟲程序對網站的騷擾。

還有一種比較常見的情況,就是某個搜索引擎的爬蟲對網站爬取頻率過高,但是搜索引擎給網站帶來了很多流量,我們並不希望簡單的封鎖爬蟲,僅僅是希望降低爬蟲的請求頻率,減輕爬蟲對網站造成的負載,那麼我們可以這樣做:
C代碼 $HTTP["user-agent"] =~ "Baispider+" { connection.delay-seconds = 10 } $HTTP["user-agent"] =~ "Baispider+" { connection.delay-seconds = 10 }
對網路的爬蟲請求延遲10秒鍾再進行處理,這樣就可以有效降低爬蟲對網站的負載了。

三、通過網站流量統計系統和日誌分析來識別爬蟲

有些爬蟲喜歡修改User-Agent信息來偽裝自己,把自己偽裝成一個真實瀏覽器的User-Agent信息,讓你無法有效的識別。這種情況下我們可以通過網站流量系統記錄的真實用戶訪問IP來進行識別。

主流的網站流量統計系統不外乎兩種實現策略:一種策略是在網頁裡面嵌入一段js,這段js會向特定的統計伺服器發送請求的方式記錄訪問量;另一種策略是直接分析伺服器日誌,來統計網站訪問量。在理想的情況下,嵌入js的方式統計的網站流量應該高於分析伺服器日誌,這是因為用戶瀏覽器會有緩存,不一定每次真實用戶訪問都會觸發伺服器的處理。但實際情況是,分析伺服器日誌得到的網站訪問量遠遠高於嵌入js方式,極端情況下,甚至要高出10倍以上。

現在很多網站喜歡採用awstats來分析伺服器日誌,來計算網站的訪問量,但是當他們一旦採用Google Analytics來統計網站流量的時候,卻發現GA統計的流量遠遠低於awstats,為什麼GA和awstats統計會有這么大差異呢?罪魁禍首就是把自己偽裝成瀏覽器的網路爬蟲。這種情況下awstats無法有效的識別了,所以awstats的統計數據會虛高。

其實作為一個網站來說,如果希望了解自己的網站真實訪問量,希望精確了解網站每個頻道的訪問量和訪問用戶,應該用頁面裡面嵌入js的方式來開發自己的網站流量統計系統。自己做一個網站流量統計系統是件很簡單的事情,寫段伺服器程序響應客戶段js的請求,分析和識別請求然後寫日誌的同時做後台的非同步統計就搞定了。

通過流量統計系統得到的用戶IP基本是真實的用戶訪問,因為一般情況下爬蟲是無法執行網頁裡面的js代碼片段的。所以我們可以拿流量統計系統記錄的IP和伺服器程序日誌記錄的IP地址進行比較,如果伺服器日誌裡面某個IP發起了大量的請求,在流量統計系統裡面卻根本找不到,或者即使找得到,可訪問量卻只有寥寥幾個,那麼無疑就是一個網路爬蟲。

分析伺服器日誌統計訪問最多的IP地址段一行shell就可以了:
C代碼 grep Processing proction.log | awk '{print $4}' | awk -F'.' '{print $1"."$2"."$3".0"}' | sort | uniq -c | sort -r -n | head -n 200 > stat_ip.log grep Processing proction.log | awk '{print $4}' | awk -F'.' '{print $1"."$2"."$3".0"}' | sort | uniq -c | sort -r -n | head -n 200 > stat_ip.log

然後把統計結果和流量統計系統記錄的IP地址進行對比,排除真實用戶訪問IP,再排除我們希望放行的網頁爬蟲,比方Google,網路,微軟msn爬蟲等等。最後的分析結果就就得到了爬蟲的IP地址了。以下代碼段是個簡單的實現示意:
Ruby代碼 whitelist = [] IO.foreach("#{RAILS_ROOT}/lib/whitelist.txt") { |line| whitelist << line.split[0].strip if line } realiplist = [] IO.foreach("#{RAILS_ROOT}/log/visit_ip.log") { |line| realiplist << line.strip if line } iplist = [] IO.foreach("#{RAILS_ROOT}/log/stat_ip.log") do |line| ip = line.split[1].strip iplist << ip if line.split[0].to_i > 3000 && !whitelist.include?(ip) && !realiplist.include?(ip) end Report.deliver_crawler(iplist) whitelist = [] IO.foreach("#{RAILS_ROOT}/lib/whitelist.txt") { |line| whitelist << line.split[0].strip if line } realiplist = [] IO.foreach("#{RAILS_ROOT}/log/visit_ip.log") { |line| realiplist << line.strip if line } iplist = [] IO.foreach("#{RAILS_ROOT}/log/stat_ip.log") do |line| ip = line.split[1].strip iplist << ip if line.split[0].to_i > 3000 && !whitelist.include?(ip) && !realiplist.include?(ip) end Report.deliver_crawler(iplist)
分析伺服器日誌裡面請求次數超過3000次的IP地址段,排除白名單地址和真實訪問IP地址,最後得到的就是爬蟲IP了,然後可以發送郵件通知管理員進行相應的處理。

四、網站的實時反爬蟲防火牆實現策略

通過分析日誌的方式來識別網頁爬蟲不是一個實時的反爬蟲策略。如果一個爬蟲非要針對你的網站進行處心積慮的爬取,那麼他可能會採用分布式爬取策略,比方說尋找幾百上千個國外的代理伺服器瘋狂的爬取你的網站,從而導致網站無法訪問,那麼你再分析日誌是不可能及時解決問題的。所以必須採取實時反爬蟲策略,要能夠動態的實時識別和封鎖爬蟲的訪問。

要自己編寫一個這樣的實時反爬蟲系統其實也很簡單。比方說我們可以用memcached來做訪問計數器,記錄每個IP的訪問頻度,在單位時間之內,如果訪問頻率超過一個閥值,我們就認為這個IP很可能有問題,那麼我們就可以返回一個驗證碼頁面,要求用戶填寫驗證碼。如果是爬蟲的話,當然不可能填寫驗證碼,所以就被拒掉了,這樣很簡單就解決了爬蟲問題。

用memcache記錄每個IP訪問計數,單位時間內超過閥值就讓用戶填寫驗證碼,用Rails編寫的示例代碼如下:
Ruby代碼 ip_counter = Rails.cache.increment(request.remote_ip) if !ip_counter Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes) elsif ip_counter > 2000 render :template => 'test', :status => 401 and return false end ip_counter = Rails.cache.increment(request.remote_ip) if !ip_counter Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes) elsif ip_counter > 2000 render :template => 'test', :status => 401 and return false end

這段程序只是最簡單的示例,實際的代碼實現我們還會添加很多判斷,比方說我們可能要排除白名單IP地址段,要允許特定的User-Agent通過,要針對登錄用戶和非登錄用戶,針對有無referer地址採取不同的閥值和計數加速器等等。

此外如果分布式爬蟲爬取頻率過高的話,過期就允許爬蟲再次訪問還是會對伺服器造成很大的壓力,因此我們可以添加一條策略:針對要求用戶填寫驗證碼的IP地址,如果該IP地址短時間內繼續不停的請求,則判斷為爬蟲,加入黑名單,後續請求全部拒絕掉。為此,示例代碼可以改進一下:
Ruby代碼 before_filter :ip_firewall, :except => :test def ip_firewall render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 if BlackList.include?(ip_sec) end before_filter :ip_firewall, :except => :test def ip_firewall render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 if BlackList.include?(ip_sec) end
我們可以定義一個全局的過濾器,對所有請求進行過濾,出現在黑名單的IP地址一律拒絕。對非黑名單的IP地址再進行計數和統計:
Ruby代碼 ip_counter = Rails.cache.increment(request.remote_ip) if !ip_counter Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes) elsif ip_counter > 2000 crawler_counter = Rails.cache.increment("crawler/#{request.remote_ip}") if !crawler_counter Rails.cache.write("crawler/#{request.remote_ip}", 1, :expires_in => 10.minutes) elsif crawler_counter > 50 BlackList.add(ip_sec) render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 and return false end render :template => 'test', :status => 401 and return false end ip_counter = Rails.cache.increment(request.remote_ip) if !ip_counter Rails.cache.write(request.remote_ip, 1, :expires_in => 30.minutes) elsif ip_counter > 2000 crawler_counter = Rails.cache.increment("crawler/#{request.remote_ip}") if !crawler_counter Rails.cache.write("crawler/#{request.remote_ip}", 1, :expires_in => 10.minutes) elsif crawler_counter > 50 BlackList.add(ip_sec) render :file => "#{RAILS_ROOT}/public/403.html", :status => 403 and return false end render :template => 'test', :status => 401 and return false end
如果某個IP地址單位時間內訪問頻率超過閥值,再增加一個計數器,跟蹤他會不會立刻填寫驗證碼,如果他不填寫驗證碼,在短時間內還是高頻率訪問,就把這個IP地址段加入黑名單,除非用戶填寫驗證碼激活,否則所有請求全部拒絕。這樣我們就可以通過在程序裡面維護黑名單的方式來動態的跟蹤爬蟲的情況,甚至我們可以自己寫個後台來手工管理黑名單列表,了解網站爬蟲的情況。

這個策略已經比較智能了,但是還不夠好!我們還可以繼續改進:

1、用網站流量統計系統來改進實時反爬蟲系統

還記得嗎?網站流量統計系統記錄的IP地址是真實用戶訪問IP,所以我們在網站流量統計系統裡面也去操作memcached,但是這次不是增加計數值,而是減少計數值。在網站流量統計系統裡面每接收到一個IP請求,就相應的cache.decrement(key)。所以對於真實用戶的IP來說,它的計數值總是加1然後就減1,不可能很高。這樣我們就可以大大降低判斷爬蟲的閥值,可以更加快速准確的識別和拒絕掉爬蟲。

2、用時間窗口來改進實時反爬蟲系統

爬蟲爬取網頁的頻率都是比較固定的,不像人去訪問網頁,中間的間隔時間比較無規則,所以我們可以給每個IP地址建立一個時間窗口,記錄IP地址最近12次訪問時間,每記錄一次就滑動一次窗口,比較最近訪問時間和當前時間,如果間隔時間很長判斷不是爬蟲,清除時間窗口,如果間隔不長,就回溯計算指定時間段的訪問頻率,如果訪問頻率超過閥值,就轉向驗證碼頁面讓用戶填寫驗證碼。

最終這個實時反爬蟲系統就相當完善了,它可以很快的識別並且自動封鎖爬蟲的訪問,保護網站的正常訪問。不過有些爬蟲可能相當狡猾,它也許會通過大量的爬蟲測試來試探出來你的訪問閥值,以低於閥值的爬取速度抓取你的網頁,因此我們還需要輔助第3種辦法,用日誌來做後期的分析和識別,就算爬蟲爬的再慢,它累計一天的爬取量也會超過你的閥值被你日誌分析程序識別出來。

總之我們綜合運用上面的四種反爬蟲策略,可以很大程度上緩解爬蟲對網站造成的負面影響,保證網站的正常訪問。

閱讀全文

與js簽名加密方法防爬相關的資料

熱點內容
程序員右肩膀疼 瀏覽:959
python大數據進程間通信 瀏覽:887
那群程序員 瀏覽:824
哪個租房app好 瀏覽:107
直播一哥是什麼app 瀏覽:38
修羅武神為什麼停伺服器 瀏覽:348
網路伺服器埠號怎麼看 瀏覽:23
圓心cad命令 瀏覽:128
pdf在線預覽js 瀏覽:953
python編程從入門到實戰豆瓣 瀏覽:481
雲電腦伺服器可以架設在本地嗎 瀏覽:57
電壓力鍋pdf 瀏覽:702
nat埠映射linux 瀏覽:152
圖像壓縮的概念 瀏覽:650
照片文件夾怎麼不壓縮發郵箱 瀏覽:564
單片機沒反應了 瀏覽:819
我的世界pc國際版伺服器地址 瀏覽:599
如何用php連接資料庫 瀏覽:464
每種基礎鋼筋的演算法 瀏覽:790
python中ix 瀏覽:193