繁体   English   中英

2 相同的 HTTP 请求给出不同的结果?

[英]2 Same HTTP Requests Give Different Results?

这两个请求有什么区别,导致它们从服务器获得不同的结果/响应,尽管它们应该是相同的?

  1. 简单点击/导航后由 Chrome 发起的请求(成功,响应码为 302)
  2. 我只是将该请求复制为 curl 并将其导入 Postman 然后 postman 挂起

我对 Java - HttpUrlConnection(模仿所有请求标头和 cookies 就像 Chrome 发送一样)做了同样的事情,但它挂起并永远等待。 这仅仅是因为服务器逻辑不接受非浏览器客户端吗?

以下是我尝试的步骤:

1. Visited this link: https://www.tokopedia.com/p/handphone-tablet/handphone
2. I opened the inspector and opened the Network - All tab
3. I clicked one of the products
4. I clicked the top request from the Network - All tab
5. I copied it as cURL bash
6. I imported it to Postman
7. I ran that request
8. Postman hanged

确保发送完全相同的数据的唯一方法是自己通过 telnet 之类的方式手动发送。 我曾经遇到过类似的问题 - 结果是浏览器正在发送一大块数据,而我的代码是逐行发送数据。 没有网站应该有这个问题,但它可能存在。

服务器可能正在检查用户代理请求 header并将阻止不是来自浏览器的流量。 尝试将 header 中的curl或您的 Java 代码设置为对应于(任何)浏览器的值。 我在一些电子商店和商业网站上遇到过这种行为。

实际上,问题甚至可能比其他答案所说的更深。

因此,用户代理请求 header 和 telnet 都不能解决该问题(除非您也使用 telnet 手动初始化 TLS 握手,但这几乎不可能完成)。

TLS 指纹识别

如果连接是 SSL/TLS 连接,服务器可以检测使用哪种算法生成密钥,并且大多数应用程序都有其特定的签名/密码。

因此,仅通过 TLS 握手,您就可以从 Postman 或 FireFox 或 Java 中分辨出 Chrome。 Java 通常 - 除非 JVM 实现真的想要 go 越野 - 在所有平台上具有相同的签名,在所有平台上使用相同的密码/算法。

很抱歉,我无法正确回忆这种技术的名称。 我知道发布的第一个项目称为“A3”或“S3”。 Salesforce发表了一篇关于JA3分析的文章。 他们描述了该技术并显示了签名和应用程序列表,因此您可以猜测您正在与之交谈的应用程序,甚至无需解密数据: https://engineering.salesforce.com/tls-fingerprinting-with-ja3 -and-ja3s-247362855967

我的解决方案

我也有同样的问题,想扫描 NVidia 或 AMD 服务器的显卡可用性。 从 Java 没有工作,所以经过大量研究,找到上面提到的项目,我只是使用 Selenium 来控制 FireFox 并以这种方式得到了我的目标服务器响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM