我正在编写一个应用程序来监听 HTTP 流量并尝试识别哪些请求是由人发起的。
例如:用户在其地址栏中键入cnn.com,这会启动一个请求。然后我想 在丢弃任何其他请求(例如XHR等)的同时找到CNN的服务器响应
你怎么能从标题信息中看出什么是什么?
在做了一些研究之后,我发现相关的回应是:
- 内容类型:文本/html
- Html 带有一个有意义的标题
- 状态 200 正常
没有办法从电线上的位来判断。HTTP 协议具有定义的格式,所有(未损坏的)用户代理都遵守该格式。
您可能认为可以从协议有效负载中检测到用户在网络上将“cnn.com”输入到“http://www.cnn.com/”的翻译。答案是否定的,它不能。
要检测允许用户使用这种速记的用户代理,您必须窥探用户代理应用程序(例如浏览器)本身。
实际上,检测非人类代理是一个有趣的问题(垃圾邮件检测是一个明显的动机)。这是因为 HTTP 属于 NVT 协议家族,不管你信不信,其基本思想是人类应该能够在网络终端/控制台程序(例如 telnet 客户端)中“手动”运行协议.) 换句话说,该协议基本上被设计为好像人类正在使用它一样。
我无法提供任何代码来提供帮助,但我会说看看Referer
HTTP 标头。初始GET
请求不应该有Referer
,但是当您开始加载页面上的资源(例如 JavaScript、CSS 等)时,Referer
将设置为请求这些资源的 URL。
因此,当我在浏览器中输入“stackoverflow.com”并回车时,浏览器将发送一个GET
带有 no 的请求Referer
,如下所示:
GET / HTTP/1.1
Host: stackoverflow.com
# ... other Headers
但是,当浏览器在页面上加载支持的静态资源时,每个请求都会有一个Referer
标头,如下所示:
GET /style.css HTTP/1.1
Host: stackoverflow.com
Referer: http://www.stackoverflow.com
# ... other Headers
我认为标头信息不足以从机器人中识别出真实用户,因为机器人是用来模仿真实用户的,而标头很容易模仿。
您可以做的一件事是跟踪用户所遵循的路径(点击序列),这很可能与机器人制作的路径不同,并对发布的信息进行一些分析(即贝叶斯过滤器)。
一个非常容易实施的检查是基于 IP 源。有黑名单 IP 地址的数据库,请参阅Project Honeypot - 如果您正在用 Java 编写软件,这里有一个如何检查 IP 地址的示例:如何查询 HTTP:BL 的垃圾邮件 IP 地址。
我在我的博客上做的是这个(使用 wordpress 插件):
应用上述规则,我的博客上不再有垃圾邮件。我认为类似的逻辑可以用于任何网站。
这种方法的优势在于,大多数用户甚至都不会注意到任何安全机制,因为 99% 的时间都不会显示验证码,也不会发生任何异常情况。但仍然有相当严格和有效的检查在幕后进行。