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 判断一个请求是否真的来自一个搜索引擎爬虫。

ASP.NET Core 中的 User Agent 识别及搜索引擎爬虫鉴定方法相关推荐

  1. 在 ASP.NET Core 中集成 Skywalking APM

    前言 大家好,今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking,Skywalking 是 Apache 基金会下面的一个开源 APM 项目,有些同学可能会 APM ...

  2. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  3. ASP.NET Core 中的规约模式(Specification Pattern )——增强泛型仓储模式

    原文链接:https://codewithmukesh.com/blog/specification-pattern-in-aspnet-core/ 在本文中,我们将讨论在 ASP.NET Core ...

  4. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

     1622219047536 写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下 ...

  5. 在Asp.Net Core中使用ModelConvention实现全局过滤器隔离

    从何说起 这来自于我把项目迁移到Asp.Net Core的过程中碰到一个问题.在一个web程序中同时包含了MVC和WebAPI,现在需要给WebAPI部分单独添加一个接口验证过滤器IActionFil ...

  6. ASP.NET Core中为指定类添加WebApi服务功能

    POCO Controller是 ASP.NET Core 中的一个特性,虽然在2015年刚发布的时候就有这个特性了,可是大多数开发者都只是按原有的方式去写,而没有用到这个特性.其实,如果利用这个特性 ...

  7. ASP.NET Core 中文文档 第三章 原理(3)静态文件处理

    原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...

  8. 如何使用C#在ASP.NET Core中轻松实现QRCoder

    by Yogi 由瑜伽士 如何使用C#在ASP.NET Core中轻松实现QRCoder (How to easily implement QRCoder in ASP.NET Core using ...

  9. asp.net core中IHttpContextAccessor和HttpContextAccessor的妙用

    分享一篇文章,关于asp.net core中httpcontext的拓展. 现在,试图围绕HttpContext.Current构建你的代码真的不是一个好主意,但是我想如果你正在迁移一个企业类型的应用 ...

最新文章

  1. flask和ajax,Flask flash和url_用于AJAX
  2. 在 Windows XP 下查看所有卷标信息
  3. J-LINK序列号修改
  4. html5 微格式,HTML5 微格式和相关的属性名称
  5. PyQt5笔记(06) -- 菜单
  6. sed和awk的常用实例 .
  7. Nacos初探(2)-- 服务注册原理解析
  8. centos ipython tab键上下键不起作用
  9. 谷歌广告联盟怎么收款?google AdSense 广告款收取流程!(转载)
  10. 百度Site App的uaredirect.js实现手机访问,自动跳转网站手机版
  11. Haproxy+Nginx搭建负载均衡集群
  12. 使用pygame制作双人五子棋小游戏
  13. ABAP 7.4 CORRESPONDING()语法
  14. 锐捷服务器系统安全,更安全 锐捷网络发布RG-ESS易安全系统
  15. Unity 径向模糊 简易解决方案
  16. 【django】用户登录模块实现步骤(二)之QQ登录工具AgentLogin和通过OAuth2.0认证获取openid【33】
  17. 算法刷题(蓝)【基础篇+算法篇】【Python版】
  18. MATLAB傅里叶级数分解极其图像
  19. Sailfish应用开发入门(二)Sailfish SDK 简介
  20. Matlab生成sinc信号

热门文章

  1. 树莓派 Raspberry Pi 更换国内源
  2. 兄弟连学python——MongoDB相关
  3. tcp/ip ---数据封装过程
  4. WinHEC(Windows硬件project产业创新峰会)将2015回归
  5. R中大数据量数据框的合并慎重使用rbind
  6. Debian7 apt源设置
  7. Android网络通信的六种方式示例代码
  8. 计算机答辩答不上来怎么回答,答辩答不上来怎么办
  9. 在Ubuntu 11.10中将窗口按钮移回右侧
  10. 如何从Internet Explorer或Edge迁移到Chrome(以及为什么要迁移)