User Agent中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
百度百科
在 ASP.NET Core 中,可以通過以下代碼在 Action 中獲取到一個 HTTP 請求的 User Agent 信息:
if (Request.Headers.TryGetValue("User-Agent", out var userAgent)) { await Response.WriteAsync("User Agent:" + userAgent); }
一個常見的 UA 字符串可以是下面這個樣子:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36
UAParser
可以通過一個名為 UAParser 的組件對 User Agent 進行解析:
var parser = Parser.GetDefault(); var info = parser.Parse("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"); info.Device.Dump("設備信息"); info.OS.Dump("操作系統信息"); info.UA.Dump("用戶代理信息");
注意:Dump 擴展方法來自 LINQPad ,可以在碼農很忙搜索 LINQPad 了解更多信息。
輸出信息如下:

其中,UAParser.Device 類型的 IsSpider 屬性表示這個 User Agent 是否代表一個網絡爬蟲。以 Google 搜索引擎為例,它的 User Agent 是這樣的:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
這將會產生如下輸出:

可以看到,UAParser告訴我們,這是一個來自於蜘蛛的 User Agent。
rDNS
即便我們使用 UAParser 根據 User Agent 做出了爬蟲的判定,但因為 User Agent 的偽造成本極低,我們仍需要一個更嚴格的規則來確定該請求是否真的來自一個搜索引擎蜘蛛,在一些防爬取場景下更是如此。
可逆DNS(rDNS,reverse DNS)是一種把一個IP地址分解成一個域名的方法,正像域名系統(DNS)把域名分解成關聯的IP地址。
大型的搜索引擎提供商,比如谷歌、百度以及微軟均會有固定的 IP 地址作為爬蟲的 IP ,並且會將這些 IP 做 rDNS 解析。可以通過查詢某個 IP 的 rDNS 解析記錄,來判斷這個 IP 到底是不是真的來自谷歌或者百度。
以谷歌爬蟲的某個 IP:66.249.79.250 為例,在 Windows 系統上,可以使用 nslookup 命令查詢該 IP 的 rDNS 記錄:

但如果是一個偽造的搜索引擎蜘蛛,則該 IP 不存在 rDNS 記錄或者記錄並不來自對應的搜索引擎:

可以使用系統內置的 Dns 類來獲取一個 IP 的 rDNS 解析記錄:
Dns.GetHostEntry("66.249.79.250").Dump();

GetHostEntry 方法也提供異步的版本: GetHostAddressesAsync 。如果在正式程序中使用該代碼,請做好異常處理。

總結
本文講述了如何在 ASP.NET Core 項目中獲取用戶的 User Agent 信息,並通過 UAParser 組件對獲取到的 User Agent 進行解析。以及如何通過來訪 IP 判斷一個請求是否真的來自一個搜索引擎爬蟲。文章來源:https://www.coderbusy.com/archives/732.html
