您在這裡

反查主機域名來屏蔽爬蟲采集

James Qi 在 2018年12月14日 - 15:56 發表

  最近新增了一些網站内容,結果正常的訪問者還沒有開始來,采集的爬蟲就來了,真像是嗜血的鲨魚,發現哪裡有美味馬上就盯上了😰。

  近期也看了一些關于反采集的文章,世上沒有完美、一勞永逸的反采集辦法,成了與采集者的對峙,雙方不斷變換對抗辦法,成了一種體力活。

  我們現在也不得不采取更嚴格的反采集措施,看到很多采集IP都來自amazon雲計算,這就可以用hostname反查來進行屏蔽,以前曾經做過測試,今天再次測試并記錄。

  在apache的httpd.conf文件中添加一行:

HostnameLookups on

  就是開啟了來訪IP的域名反查主機名,例如IP地址59.174.217.219反查到的主機名是219.217.174.59.broad.wh.hb.dynamic.163data.com.cn。

  然後可以在.htaccess中設置屏蔽:

RewriteCond %{REMOTE_HOST} ^.*(\.174\.59\.broad\.wh\.hb\.dynamic\.163data\.com\.cn).*$
RewriteRule .* - [F,L]

  這就把武漢電信163寬帶59.174開頭的IP的用戶都屏蔽了。

  增加了這個辦法後,屏蔽的辦法更靈活了,但有一點問題,就是開啟了反查後比較消耗資源,服務器的負載會有所升高,返回用戶的内容會有所延時。所以我看一般的介紹文章都說要關閉這個功能,但究竟開啟這個後是否屏蔽更有效,還有待觀察看看。


  2019年4月10日補充:上面這樣修改後就有了反向解析,但accesss日志文件中是顯示反向解析後的域名、還是顯示反向解析以前的IP,是可以控制設置的,例如這樣是顯示hostname:

LogFormat "%h %l %u %t port:%p \"%{Host}i\" \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

下面這行是顯示ip:

LogFormat "%a %l %u %t port:%p \"%{Host}i\" \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

更多日志參數的含義如下:

%a 遠端IP地址
%A 本機IP地址
%B 除HTTP頭以外傳送的字節數
%b 以CLF格式顯示的除HTTP頭以外傳送的字節數,也就是當沒有字節傳送時顯示’-'而不是0。
%{Foobar}C 在請求中傳送給服務端的cookieFoobar的内容。
%D 服務器處理本請求所用時間,以微為單位。
%{FOOBAR}e 環境變量FOOBAR的值
%f 文件名
%h 遠端主機
%H 請求使用的協議
%{Foobar}i 發送到服務器的請求頭Foobar:的内容。
%l 遠端登錄名(由identd而來,如果支持的話),除非IdentityCheck設為"On",否則将得到一個"-"。
%m 請求的方法
%{Foobar}n 來自另一個模塊的注解Foobar的内容。
%{Foobar}o 應答頭Foobar:的内容。
%p 服務器服務于該請求的标準端口。
%P 為本請求提供服務的子進程的PID。
%{format}P 服務于該請求的PID或TID(線程ID),format的取值範圍為:pid和tid(2.0.46及以後版本)以及hextid(需要APR1.2.0及以上版本)
%q 查詢字符串(若存在則由一個"?"引導,否則返回空串)
%r 請求的第一行
%s 狀态。對于内部重定向的請求,這個狀态指的是原始請求的狀态,—%>s則指的是最後請求的狀态。
%t 時間,用普通日志時間格式(标準英語格式)
%{format}t 時間,用strftime(3)指定的格式表示的時間。(默認情況下按本地化格式)
%T 處理完請求所花時間,以秒為單位。
%u 遠程用戶名(根據驗證信息而來;如果返回status(%s)為401,可能是假的)
%U 請求的URL路徑,不包含查詢字符串。
%v 對該請求提供服務的标準ServerName。
%V 根據UseCanonicalName指令設定的服務器名稱。
%X 請求完成時的連接狀态:X= 連接在應答完成前中斷。
+= 應答傳送完後繼續保持連接。
-= 應答傳送完後關閉連接。

(在1.3以後的版本中,這個指令是%c,但這樣就和過去的SSL語法:%{var}c沖突了)

%I 接收的字節數,包括請求頭的數據,并且不能為零。要使用這個指令你必須啟用mod_logio模塊。
%O 發送的字節數,包括請求頭的數據,并且不能為零。要使用這個指令你必須啟用mod_logio模塊。

修飾符

可以緊跟在"%"後面加上一個逗号分隔的狀态碼列表來限制記錄的條目。例如,"%400,501{User-agent}i" 隻記錄狀态碼400和501發生時的User-agent頭内容;不滿足條件時用"-"代替。狀态碼前還可以加上"!"前綴表示否 定,"%!200,304,302{Referer}i"記錄所有不同于200,304,302的狀态碼發生時的Referer頭内容。

"<"和">"修飾符可以用來指定對于已被内部重定向的請求是選擇原始的請求還是選擇最終的請求。默認情況下,%s, %U, %T, %D, %r 使用原始請求,而所有其他格式串則選擇最終請求。例如,%>s 可以用于記錄請求的最終狀态,而 %<u 則記錄一個已經被内部重定向到非認證資源的請求的原始認證用戶。

一些說明

出于安全考慮,從2.0.46版本開始,%r, %i, %o 中的特殊字符,除了雙引号(")和反斜線(\)分别用 \" 和 \\ 進行轉義、空白字符用C風格(\n, \t 等)進行轉義以外,非打印字符和其它特殊字符使用 \xhh 格式進行轉義(hh是該字符的16進制編碼)。在2.0.46以前的版本中,這些内容會被完整的按原樣記錄。這種做法将導緻客戶端可以在日志中插入控制字 符,所以你在處理這些日志文件的時候要特别小心。

在2.0版本中(不同于1.3),%b 和 %B 格式字符串并不表示發送到客戶端的字節數,而隻是簡單的表示HTTP應答字節數(在連接中斷或使用SSL時與前者有所不同)。mod_logio提供的 %O 格式字符串将會記錄發送的實際字節數。

示例

一些常見的格式串:

通用日志格式(CLF)
"%h %l %u %t \"%r\" %>s %b"

帶虛拟主機的通用日志格式
"%v %h %l %u %t \"%r\" %>s %b"

NCSA擴展/組合日志格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""

Referer日志格式
"%{Referer}i -> %U"

Agent(Browser)日志格式
"%{User-agent}i"

發表新回應

Plain text

  • 不允許使用 HTML 標籤。
  • 自動將網址與電子郵件地址轉變為連結。
  • 自動斷行和分段。