Как отправить несколько значений заголовка с тем же именем, используя CURL? - PullRequest
0 голосов
/ 27 августа 2018

Я изо всех сил пытался воспроизвести проблему, с которой мы сталкиваемся в Production.Клиенты отправляют несколько заголовков с одним и тем же именем через cookie, и мы пытаемся устранить их через CURL.Намерение состоит в том, чтобы отправить ДВА значения заголовка для того же имени заголовка, чтобы приложение (ниже как myhost) могло перехватить его с помощью этой попытки скручивания.Однако, когда я пытаюсь что-то подобное, сервер, значение «x-targetted-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 голосов
/ 27 августа 2018

Это ограничение самого протокола HTTP.Вы не можете отправлять несколько заголовков с одним и тем же именем, если они не отправлены в том же ключе, что и список значений, разделенных запятыми.Взгляните на этот ответ .

0 голосов
/ 27 августа 2018

Я использую для выполнения много синтаксических атак с ошибочными запросами на 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

Как только вы привыкнете, это удовольствие, никаких ограничений.

0 голосов
/ 27 августа 2018

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 говорит о нескольких заголовках с одинаковым именем (они разрешены):

Несколько полей заголовка сообщения с одним и тем же именем поля МОГУТ присутствовать в сообщении тогда и только тогда, когда все значение поля для этого поля заголовка определено как список, разделенный запятыми [т.е. # (значения)].ДОЛЖНО быть возможно объединить несколько полей заголовка в одну пару «field-name: field-value», не изменяя семантику сообщения, добавляя каждое последующее значение поля к первому, каждое из которых разделяется запятой.Порядок, в котором принимаются поля заголовка с одним и тем же именем поля, поэтому важен для интерпретации объединенного значения поля, и, таким образом, прокси-сервер НЕ ДОЛЖЕН изменять порядок этих значений поля при пересылке сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...