【发布时间】:2018-01-03 11:33:15
【问题描述】:
在 Google Chrome 中,我可以查看浏览器发送和接收的 http 标头。一个有趣的选项是您可以复制整个请求/响应作为 cURL cmd。
问题是,每次我运行生成的 cURL 命令时,虽然服务器发送 HTTP/1.1 200 OK,但 content-length 是零,即当浏览器本身发送相同的请求时,情况并非如此。
你觉得可能是什么问题?
【问题讨论】:
在 Google Chrome 中,我可以查看浏览器发送和接收的 http 标头。一个有趣的选项是您可以复制整个请求/响应作为 cURL cmd。
问题是,每次我运行生成的 cURL 命令时,虽然服务器发送 HTTP/1.1 200 OK,但 content-length 是零,即当浏览器本身发送相同的请求时,情况并非如此。
你觉得可能是什么问题?
【问题讨论】:
听起来像是一个可以防御 DDoS 攻击的 HTTP 服务器。
HTTP 服务器可能期望每个请求都包含特定于操作的时间和顺序的内容。它可能作为特殊标记驻留在标头或正文中。
我的猜测是每次服务器可能会使用不同的 cookie 值进行响应,这使得发送 2 个具有相同 cookie 值的请求无效。或者它可能是使用 UTC 时间作为参数的东西。无论如何,您的请求中肯定有一些内容没有通过服务器端过滤。
--
或者类似地,它可能是一次性使用的资源。例如。为一次性下载准备的临时文件。一旦被访问,该文件就不再可用了。
【讨论】:
我会将此添加为评论,但我没有声誉。
我刚刚体验过这个问题,修复它的方法令人惊讶。在我的情况下,我正在登录服务器,因此我可以上传文件,让服务器对其进行处理,然后下载新文件。我首先在 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 有些网站在初次登录后需要更多请求,然后才能发布。我会尝试捕获服务器和浏览器之间的成功交换并查看所有请求。有些请求可能并不像看起来那样多余。
【讨论】:
如果你发送一个 GET 请求,并且有一些参数,那么 url 应该是这样的:
http://www.example.com/login?user='abc'&pwd='123'
确保在url中使用'\'转义'&','&'是使用shell时将进程发送到后台的特殊关键字。
否则上面的url会被截断为:
http://www.example.com/login?user='abc'
【讨论】: