这两个请求的区别是什么?这两个要求虽然应该相同,但会导致它们从服务器得到不同的结果/响应?
- Chrome在简单的点击/导航(成功,响应代码为302(
- 我只是复制将该请求作为curl导入Postman,然后导入Postman悬挂
我对Java-HttpUrlConnection做了同样的操作(模仿Chrome发送的所有请求头和cookie(,但它挂起了,等待了很久。这仅仅是因为服务器逻辑不接受非浏览器客户端吗?
以下是我尝试过的步骤:
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都无法解决该问题(除非您也使用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
我的解决方案
我也有同样的问题,想扫描英伟达或AMD服务器的图形卡可用性。我不是用Java工作的,所以经过大量的研究,找到了上面提到的项目,我只是简单地使用Selenium来控制FireFox,它得到了正确的服务器响应,我通过这种方式实现了我的目标。
确保发送完全相同的数据的唯一方法是通过telnet等方式手动发送。我曾经遇到过类似的问题——原来浏览器是在一大块数据中发送数据,而我的代码是逐行发送的。任何网站都不应该有这个问题,但它可能存在。
服务器可能正在检查用户代理请求标头,并将阻止非来自浏览器的流量。尝试将curl或Java代码中的头设置为与(任何(浏览器相对应的值。我在一些电子商店和商业网站上遇到过这样的行为。