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

Posted

技术标签:

【中文标题】2 相同的 HTTP 请求给出不同的结果?【英文标题】:2 Same HTTP Requests Give Different Results? 【发布时间】:2022-01-10 06:33:34 【问题描述】:

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

    Chrome 发起简单请求后的请求 点击/导航(成功,响应码为302) 我只是复制了 该请求作为卷曲并将其导入邮递员,然后邮递员 绞死

我对 Java 做了同样的事情 - HttpUrlConnection(模仿所有请求标头和 cookie,如 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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

我已经在 J​​ava 中进行了设置,当我将该请求从 Chrome 复制到 cURL 时,所有标头和 cookie 都已根据原始请求设置。(总共 22 个请求标头)。 当我遇到这个问题时,我需要使用 Python 请求和 Beautiful Soup 来抓取网页。我记得必须尝试多个用户代理 (UA) 字符串,因为服务器拒绝旧的 Mozilla UA,并且连接如您所描述的那样挂起。较新的 Mozilla UA 最终奏效了。但是您说您的 Chrome 可以在该站点上正常工作,如果复制了所有标题,它应该可以与其他客户端一起使用。也许检查 whatismybrowser.com/detect/what-is-my-user-agent 上的 UA 是否设置正确 抱歉,没有更好的想法。【参考方案3】:

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

因此,无论是 User-Agent 请求标头还是 telnet 都无法解决该问题(除非您也使用 telnet 手动初始化 TLS 握手,但这几乎不可能完成)。

TLS 指纹识别

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

因此,只有通过 TLS 握手,您才能将 Chrome 与 Postman、FireFox 或 Java 区分开来。 Java 通常 - 除非 JVM 实现真的想要走出困境 - 在所有平台上具有相同的签名,在所有实现中使用相同的密码/算法。

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

我的解决方案

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

【讨论】:

以上是关于2 相同的 HTTP 请求给出不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

在一个http请求中多次调用相同的GraphQL突变操作[重复]

来自 Vue 中不同组件的多个请求 - 最佳实践

同源策略与跨域问题解决

接口自动化测试

Alamofire 打印请求给出 nil

axios 在 20 秒内给出响应,但具有相同请求负载的相同 api 在 6 秒内从邮递员给出响应