如何使用CURL发送具有相同名称的多个标头值?

时间:2018-08-26 22:24:21

标签: http curl

我一直在努力复制生产中遇到的问题。客户端正在通过Cookie发送多个具有相同名称的标头,而我们正尝试通过CURL对它们进行故障排除。 目的是为相同的标头名称发送两个标头值,以便应用程序(以下称为myhost)可以通过此curl尝试拦截它。但是,当我尝试类似的操作时,服务器的“ x-targeted-group”值无法解析。如果我使用-H "X-targetted-group:Group1" - "x-targetted-group:Group2"发送两个标头,则服务器获得第一个标头。我如何发送两者?

curl -i -H "Accept: application/json" -H "x-targetted-group:Group1,Group2"  https://myhost:8990/"

3 个答案:

答案 0 :(得分:0)

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 spec对于具有相同名称的多个标头(允许)说了什么:

  

当且仅当该报头字段的整个字段值都定义为逗号分隔的列表[即#(values)]时,消息中才会存在多个具有相同字段名的消息报头字段。通过将每个后续字段值附加到第一个字段(每个字段用逗号分隔),必须能够将多个头字段组合成一个“字段名称:字段值”对,而无需更改消息的语义。因此,具有相同字段名称的报头字段的接收顺序对于组合字段值的解释很重要,因此代理在转发消息时不得更改这些字段值的顺序。

答案 1 :(得分:0)

我曾经在HTTP服务器上执行很多错误查询语法攻击。根据定义curl或wget不会让您做很多不好的语法工作。

您应该尝试使用低级netcat + printf。

使用printf编写HTTP查询,然后netcat将管理套接字连接(对于ssl连接,您可以使用openssl_client替换netcat)。

看起来(对于基本查询):

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中编写%character):

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

一旦您习惯了它,那是一种荣幸,没有限制。

答案 2 :(得分:-1)

这是HTTP协议本身的限制。除非使用与逗号分隔的值列表相同的键发送标题,否则不允许发送具有相同名称的多个标题。看看这个answer