如何识别由人工发出的GET/POST请求,忽略以下任何请求
How to identify GET/POST requests made by a human ignoring any requests following
我正在编写一个侦听HTTP流量的应用程序,并试图识别哪些请求是由人类发起的。
例如:用户在地址栏中输入cnn.com,这将启动一个请求。然后我想找到CNN的服务器响应,同时丢弃任何其他请求(如XHR等)
你怎么能从头信息中知道什么是什么意思呢?
在做了一些研究之后,我发现相关的回答是:
- 的content - type: text/html Html有一个有意义的标题
- 状态200 ok
没有办法从电线上的比特来判断。HTTP协议有一个已定义的格式,所有(未损坏的)用户代理都遵守该格式。
你可能认为用户输入的"cnn.com"转换成"http://www.cnn.com/"可以从协议有效载荷中检测到。答案是否定的,它不能。
要检测允许用户这样速记的用户代理,您必须窥探用户代理应用程序(例如浏览器)本身。
实际上,检测非人类代理是一个有趣的问题(垃圾邮件检测是一个明显的动机)。这是因为HTTP属于NVT协议家族,信不信由你,它的基本思想是,一个人应该能够在网络终端/控制台程序(如telnet客户端)中"手动"运行协议。换句话说,该协议的设计基本上就像人类在使用它一样。
我认为标头信息不足以从bot中识别真实用户,因为bot是用来模仿真实用户的,而标头很容易被模仿。
你可以做的一件事是跟踪用户所遵循的路径(点击顺序),这很可能与机器人所做的不同,并对发布的信息进行一些分析(即贝叶斯过滤器)。
一个非常容易实现的检查是基于IP源。有黑名单IP地址的数据库,请参阅项目蜜罐-如果你正在用java编写软件,这里有一个关于如何检查IP地址的示例:如何查询HTTP:BL中的垃圾邮件IP地址。
我在我的博客上是这样做的(使用wordpress插件):
- 检查IP地址是否在HTTP:BL中,如果是,则向用户显示一个html页面,以采取行动将其IP地址列入白名单。
- 当用户提交一些内容时,贝叶斯过滤器验证他提交的内容,如果他的评论被识别为垃圾邮件,则在完成提交之前显示验证码。这是通过查询和条件验证码完成的,并且评论也排队等待手动批准。
- 经过一次批准后,同一用户被认为是安全的,可以不受限制/检查地发布。
应用上述规则,我的博客上没有更多的垃圾邮件。我认为类似的逻辑可以用于任何网站。
这种方法的优点是,大多数用户甚至没有注意到任何安全机制,因为没有captcha显示,也没有任何不寻常的事情发生在99%的时间。但是,仍然有相当严格和有效的检查在幕后进行。
我不能提供任何代码来帮助,但我会说看看Referer
HTTP头。初始GET
请求不应该有Referer
,但是当您开始加载页面上的资源(如JavaScript, CSS等)时,Referer
将被设置为请求这些资源的URL。
所以当我在浏览器中输入"stackoverflow.com"并按回车键时,浏览器会发送一个GET
请求,没有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
- 如何使用boost/beast从HTTP POST请求中解析和提取有效负载?
- 如何使用 curl 将 POST 请求从 python 重写为 C++
- 从简单的 POST 请求中解析异常
- 使用 cpp-httplib 的 POST 请求
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- C++中的 cURL POST 请求
- C++ Schannel POST 400 错误代码错误请求
- c++curl返回413请求实体过大,但是post大小远小于max大小
- HTTP POST 请求不允许我定义上下文类型
- 如何在c++中使用libcurl发送POST请求并接收它
- 我想将 POST 请求从 arduino 发送到 mysql 工作台并保存值
- 如何捕获从 MFC Web 浏览器 c++ 发出的 GET/POST 请求
- 如何解决来自 arduino 的 post 请求的问题,在失败之前只收到 2-3 次
- C HTTP POST 400不良请求
- 使用 restbed C++发送 POST 多部分/表单数据请求
- C++ 对 nodejs 服务器的 POST 请求失败(基于套接字)
- Qt Post请求正在执行但失败
- 使用C REST SDK(Casablanca)的HTTP_CLIENT POST请求
- 使用CPP手动构建POST请求,并使用它提交php表单
- 如何在 qt main() 中运行 post 请求