zoukankan      html  css  js  c++  java
  • ASP.NET Core 中的 User Agent 识别及搜索引擎爬虫鉴定方法

    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

  • 相关阅读:
    [经验栈]C#中几种定时器(timer)的区别
    [经验栈]C#与泰克示波器(Tektronix oscilloscope)MSO64通信操作
    [经验栈]C#监测IPv4v6网速及流量
    [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
    [技术栈]C#利用Luhn算法(模10算法)对IMEI校验
    [经验栈]SQL语句逻辑运算符"AND"、"&&"兼容性
    Winform或WebForm使用ReportViewer报表设计,工具栏按钮英文显示的解决办法
    Dev 使用RibbonForm打开多标签窗体,主窗体的Text显示一个
    Devexpress如何获取RadioGroup选中项的值和显示值
    MySQL远程连接失败,MySQL远程连接出现Using password:YES错误的解决办法
  • 原文地址:https://www.cnblogs.com/Soar1991/p/13776083.html
Copyright © 2011-2022 走看看