【问题标题】:Why http requests sent by cURL give different result than browsers?为什么 cURL 发送的 http 请求给出的结果与浏览器不同?
【发布时间】:2018-01-03 11:33:15
【问题描述】:

在 Google Chrome 中,我可以查看浏览器发送和接收的 http 标头。一个有趣的选项是您可以复制整个请求/响应作为 cURL cmd

问题是,每次我运行生成的 cURL 命令时,虽然服务器发送 HTTP/1.1 200 OK,但 content-length 是零,即当浏览器本身发送相同的请求时,情况并非如此。

你觉得可能是什么问题?

【问题讨论】:

    标签: http curl


    【解决方案1】:

    听起来像是一个可以防御 DDoS 攻击的 HTTP 服务器。

    HTTP 服务器可能期望每个请求都包含特定于操作的时间和顺序的内容。它可能作为特殊标记驻留在标头或正文中。

    我的猜测是每次服务器可能会使用不同的 cookie 值进行响应,这使得发送 2 个具有相同 cookie 值的请求无效。或者它可能是使用 UTC 时间作为参数的东西。无论如何,您的请求中肯定有一些内容没有通过服务器端过滤。

    --

    或者类似地,它可能是一次性使用的资源。例如。为一次性下载准备的临时文件。一旦被访问,该文件就不再可用了。

    【讨论】:

    • 哇!你给了我很多新信息...现在,如果你不介意,你会回答我的另一个大问题吗:“当我在网页内(使用浏览器)做错事时,我会收到一条警告消息. 根本没有,在开发人员工具中,我没有设法跟踪消息;在脚本中,也没有在我已经设法跟踪的 HTTP 响应中,也没有在主 HTML 文件中,......我真的疯了,因为我完全不知道这些消息来自哪里。这浪费了我一个星期的生命!!!
    • 顺便说一句,我猜它与“浏览器时间”有关,每次我发出新请求时都会将其发布到服务器;你(再次)是对的:我还可以看到来自服务器的 cookie,每个响应都有一个新值。我会试着和他们一起玩,让你(读者)知道结果。
    • @Joseph_Marzbani 也许消息存储为编码字符串,例如Base64,甚至一些更深奥的编码方案。并且可能还有其他事情可以进一步混淆消息,例如使用 ajax 获取数据,使用 eval() 运行一些逻辑等。
    • 亲爱的@cshu,感谢您的友好回复。你是对的,我想我需要更深入地研究代码(这真的是巨大的)才能找到有用的东西。感谢您的帮助...
    • chrome 具有帮助解决 curl 差异的功能:lornajane.net/posts/2013/chrome-feature-copy-as-curl
    【解决方案2】:

    我会将此添加为评论,但我没有声誉。

    我刚刚体验过这个问题,修复它的方法令人惊讶。在我的情况下,我正在登录服务器,因此我可以上传文件,让服务器对其进行处理,然后下载新文件。我首先在 Chrome 中执行此操作,并使用开发工具在这个简单的事务中捕获了 100 多个 HTTP 请求。如果我试图从命令行执行所有这些操作,大多数只是获取我不需要的资源,所以我只过滤掉了我至少知道我应该需要的资源。

    最初,这归结为设置cookie并使用用户名和密码登录的GET,上传文件的POST,执行文件工作的POST,以及检索新文件的GET。我无法让第一个 POST 实际工作。该 POST 的响应应该是包含上传 ID、上传时间等的信息,但即使状态为 200 OK,我也得到了空的 JSON 列表。

    我使用 CURL 准确地欺骗了来自浏览器的请求(复制 User-Agent、覆盖 Expect 等),但仍然一无所获。然后我开始任意添加一些我在第一次 GET 和 POST 之间从 Chrome 捕获的请求,并且在 POST 之前添加了 JSON 历史记录的 GET 请求之后,POST 实际返回了它应该返回的内容。

    TL;DR 有些网站在初次登录后需要更多请求,然后才能发布。我会尝试捕获服务器和浏览器之间的成功交换并查看所有请求。有些请求可能并不像看起来那样多余。

    【讨论】:

      【解决方案3】:

      如果你发送一个 GET 请求,并且有一些参数,那么 url 应该是这样的:

      http://www.example.com/login?user='abc'&pwd='123'
      

      确保在url中使用'\'转义'&','&'是使用shell时将进程发送到后台的特殊关键字。

      否则上面的url会被截断为:

      http://www.example.com/login?user='abc'
      

      【讨论】:

      • 这使我走上了正确的道路,但我发现将 URL 放在单引号中更容易。 (除非 URL 本身包含必须转义的单引号 - 但只有它们。)
      猜你喜欢
      • 2016-01-11
      • 2019-09-22
      • 2017-09-25
      • 2017-10-14
      • 2023-03-10
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2011-09-07
      相关资源
      最近更新 更多