需要帮助设置 curl 命令来填写表单。服务器在 302 重定向后以 HTTP/1.1 411 长度要求进行响应

Need help setting up a curl command to fill in a form. Server responds with HTTP/1.1 411 Length Required after a 302 redirect

提问人:Jurian Baas 提问时间:11/3/2023 最后编辑:273KJurian Baas 更新时间:11/4/2023 访问量:36

问:

我正在尝试编写一个批处理脚本,该脚本将使用户轻松填写有关非法烟花爆竹的警察表格。它获取有关用户的一些个人信息,并将其与当前日期和时间结合使用,为警方创建声明。个人信息也填写在表格中,以便以后可以联系他们。

发出 POST 请求时,服务器以 302 状态代码进行回复。因此,我在 curl 中使用了 -L 标志来使其遵循重定向。

但是,在此重定向后,服务器会以 411 状态代码(需要长度)进行响应。

为了添加上下文,我使用的是 curl 版本 8.0.1 (Windows) libcurl/8.0.1 Schannel WinIDN

我已经尝试过的事情:

  1. 使用 GET 而不是 POST。
  2. 使用 --post302 标志,将产生无限循环。
  3. 添加“Content-Length: 0”标头会导致 HTTP/1.1 403 Forbidden 响应。

我的批处理脚本如下:

:: First we set some variables such as name, place, date, time, etc (omitted here)

...

:: We then use these variables to create the 'data' variable
set data="melding_bericht=%melding_bericht%&plaats_voorval=%plaats_voorval%&straat_voorval=%straat_voorval%&bestanden=&voornaam=%voornaam%&tussenvoegsel=%tussenvoegsel%&achternaam=%achternaam%&straatnaam=%straatnaam%&huisnummer=%huisnummer%&huisnummer-toevoeging=%huisnummer_toevoeging%&postcode=%postcode%&woonplaats=%woonplaats%&telefoonnummer=%telefoonnummer%&email=%email%&transmit=Versturen"

:: Now issue the request to the server
curl "https://www.politie.nl/aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html" ^
  -X POST ^
  -L ^
  -H "authority: www.politie.nl" ^
  --data %data% ^
  --verbose

curl 进程中的一些日志:

首先,服务器响应:

HTTP/1.1 302 Moved Temporarily

然后:

Issue another request to this URL: 'https://www.politie.nl/aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html? (the data in the form, omitted here)'

* Switch from POST to GET
* Found bundle for host: 0x21c63c12c50 \[serially\]
* Re-using existing connection #0 with host www.politie.nl

> POST /aangifte-of-melding-doen/meldformulier-vuurwerkoverlast.html?(the urlencoded data in the form, omitted here) HTTP/1.1

在此之后,服务器响应为:

HTTP/1.1 411 Length Required

任何人都知道为什么

  1. curl 似乎又做了一个帖子请求?即使它说之前从 POST 切换到 GET

  2. 如果不是,服务器是否需要 GET 请求的内容长度?

卷曲 帖子 http-status-code-411

评论

0赞 phuzi 11/3/2023
这看起来很奇怪。即使 Curl 似乎正在执行 POST 请求,所有表单数据现在都作为查询参数存在于 URL 中,并且不发送任何内容,也不包含 Content-Length 标头。这感觉像一个错误。

答:

0赞 phuzi 11/4/2023 #1

在互联网上进行了挖掘,在 GitHub 上发现了这个问题:通过 302 重定向 POST 时,HTTP 消息无效。这让我想到了这个选项。--post302

查看“-L”选项的文档

当 curl 跟随重定向并且请求是 POST 时,如果 HTTP 响应为 301、302 或 303,则它会使用 GET 发送以下请求。如果响应代码是任何其他 3xx 代码,则 curl 使用相同的未修改方法重新发送以下请求。

您可以使用专用选项告诉 curl 不要在 30 倍响应后将 POST 请求更改为 GET:--post301、--post302 和 --post303。

这表明您可能应该包括 和选项来强制重新发送 POST 正文。--post301--post302--post303

无论哪种方式,看起来 Curl 似乎都对重定向感到有些困惑。据我所知,[HTTP/1.1 规范,第 6.4.3 节](https://datatracker.ietf.org/doc/html/rfc7231#section-6.4.3 - 302 FOUND)中没有任何内容意味着重定向应该更改为 GET 请求:

注意:由于历史原因,用户代理可以更改请求 方法从 POST 到 GET 用于后续请求。如果这 行为是不需要的,307(临时重定向)状态代码 可以代替使用。

虽然没有进入“历史原因”是什么!

评论

0赞 Jurian Baas 11/4/2023
谢谢!当我添加这三个标志时,我得到了不同的响应。仍然不是 201 或类似的东西,而是 400 状态代码(错误请求)。我不确定为什么会这样,数据编码会不会有错误?响应的 HTML 正文是“您的浏览器发送了此服务器无法理解的请求”。
0赞 phuzi 11/4/2023
看看 --verbose 选项,它可能会对实际发送的内容有所了解。
0赞 phuzi 11/4/2023
也可能有一些其他的保护措施来防止表单的自动化,例如,为了防止被DOS处理,这将要求您在请求中包含额外的信息。不过,这超出了问题的范围。
1赞 Jurian Baas 11/4/2023
是的,我可能不得不联系在他们的服务器上工作的 somoene,看看我是否可以修复它。他们不介意获得语句,因为它允许他们分配资源。至少他们是这么告诉我的。
1赞 shellter 11/7/2023
读者总是希望看到你最好的代码版本,所以请在评论中用你的修订更新你的问题的正文(然后删除评论,以避免不必要的重读,好吗?(-;? ).祝你好运。