我一直在努力复制我们在生产中面临的问题。客户端通过 cookie 发送多个具有相同名称的标头,我们正在尝试通过 CURL 解决相同问题。 目的是发送同一标头名称的两个标头值,以便应用程序(下面为 myhost)可以通过此curl 尝试拦截它。但是,当我尝试类似的操作时,服务器“x-targetted-group”值无法解析。如果我使用
-H "X-targetted-group:Group1" - "x-targetted-group:Group2"
发送两个标头,服务器only 会获取第一个标头。我怎样才能同时发送两个?
curl -i -H "Accept: application/json" -H "x-targetted-group:Group1,Group2" https://myhost:8990/"
curl
不会让你的。所以答案是你不能。更高版本的wget
也不会。
如果您想尝试奇怪的可能格式错误的 HTTP 请求,您可以自己制作 - 它只是纯文本。使用 netcat 的示例:
> cat request.txt # I.e. the contents of the file request.txt is:
GET /
Accept: application/json
X-targetted-group: Group1
X-targetted-group: Group2
> nc myhost 8990 <request.txt
HTTP 规范规定行必须以 CRLF (
\r\n
) 结尾,因此您的服务器可能不会接受上述内容,除非文本文件 request.txt
使用 CRLF 行终止(有一个像文本编辑器中那样保存的选项)。 .).
旁白:HTTP 规范对具有相同名称的多个标头有何规定(允许):
当且仅当该标头字段的整个字段值被定义为逗号分隔列表[即#(values)]时,具有相同字段名称的多个消息标头字段可以出现在消息中。通过将每个后续字段值附加到第一个字段值(每个字段值之间用逗号分隔),必须可以将多个标头字段组合成一个“字段名称:字段值”对,而不更改消息的语义。因此,接收具有相同字段名称的头字段的顺序对于组合字段值的解释很重要,因此当转发消息时,代理不得更改这些字段值的顺序。
我曾经在 HTTP 服务器上执行过很多的错误查询语法攻击。根据定义,curl 或 wget 不会让您做太多糟糕的语法工作。
您应该尝试使用低级 netcat + printf。
使用 printf,您可以编写 HTTP 查询,netcat 将管理套接字连接(对于 ssl 连接,您可以将 netcat 替换为 openssl_client)。
这看起来像(对于基本查询):
printf 'GET /my/url?foo=bar HTTP/1.1\r\n'\
'Host: www.example.com\r\n'\
'\r\n'\
| nc -q 2 127.0.0.1 80
对于更复杂的一个(重复标头和旧的 ops-fold 标头语法,还有如何在 printf 中编写 % 字符):
printf 'GET /my/url?foo=bar&percent_char=%% HTTP/1.1\r\n'\
'Host: www.example.com\r\n'\
'x-foo-header: value1\r\n'\
'x-foo-header: value2\r\n'\
'x-foo-header: value3, value4\r\n'\
'x-foo-header:\t\tval5\r\n'\
' val6\r\n'\
'User-agent: tests\r\n'\
'\r\n'\
| nc -q 2 127.0.0.1 80
一旦你习惯了它,就会很高兴,没有任何限制。
这是HTTP协议本身的限制。不允许发送具有相同名称的多个标头,除非它们以与逗号分隔的值列表相同的键发送。看看这个答案。