Максимум на значениях заголовка http?

326

Существует ли допустимый максимально допустимый размер для заголовков HTTP? Если так, то, что это? Если нет, то является ли это чем-то специфичным для сервера или является общепринятым стандартом, разрешающим заголовки любого размера?

Cory
источник

Ответы:

316

Нет, HTTP не определяет никаких ограничений. Однако большинство веб-серверов ограничивают размер принимаемых ими заголовков. Например, в Apache ограничение по умолчанию составляет 8 КБ, в IIS - 16 КБ . Сервер вернет 413 Entity Too Largeошибку, если размер заголовков превысит этот предел.

Смежный вопрос: насколько большой может получить строка агента пользователя?

Vartec
источник
10
В этом ответе указывается, что сервер принимает максимально допустимый размер заголовка. Но какой максимальный размер заголовка может отправлять веб-сервер (например, Apache)?
Pacerier
@Pacerier: это 8175 байт для Apache, похоже, но я все еще ищу. Также не ожидайте получения полезных сообщений об ошибках, если вы столкнетесь с таким ограничением из какой бы то ни было серверной части.
Хакре
2
@hakre: IIRC, 8K для всей строки, считая строки заголовка (имена заголовков, пробелы и полезные нагрузки заголовков).
vartec
Есть ли способ определить пользовательский максимальный размер заголовка?
Судип Болахе
Вероятно, IIS открыт для 16 КБ из-за требований протоколов SPNego и Kerberos, и они часто используются для «аутентификации Windows».
Ронан Кердуду
220

Как сказано выше в vartec, спецификация HTTP не определяет ограничение, однако многие серверы определяют по умолчанию. Это означает, что, практически говоря, нижний предел составляет 8K . Для большинства серверов это ограничение применяется к сумме строки запроса и ВСЕХ полей заголовка (поэтому держите ваши куки короткими).

Стоит отметить, что nginx по умолчанию использует системный размер страницы, который в большинстве систем составляет 4 КБ. Вы можете проверить с помощью этой крошечной программы:

pagesize.c:

#include <unistd.h>
#include <stdio.h>

int main() {
    int pageSize = getpagesize();
    printf("Page size on your system = %i bytes\n", pageSize);
    return 0;
}

Скомпилируйте и gcc -o pagesize pagesize.cзапустите ./pagesize. Мой сервер Ubuntu от Linode покорно сообщает мне, что ответ 4k.

Дэвид Шуновер
источник
6
Для apache2 длина URL-адреса контролируется LimitRequestLineи LimitRequestFieldSizeприменяется к каждой строке заголовка HTTP в отдельности ... а не к "сумме ..."
Ив Мартин,
1
Файлы cookie имеют отдельное ограничение общего размера в 4093 байта. stackoverflow.com/questions/640938/…
Джефф Лоури
25
Не нужно писать код, чтобы получить размер страницы. Из терминала: getconf PAGESIZE
Ponytech
6
Вероятно, это изменилось с момента написания этого ответа, но ссылка на страницу nginx не соответствует ответу. Страница nginx указывает, что размер буфера по умолчанию равен 8 КБ, и что запрос может использовать 4 буфера по умолчанию (сам размер буфера ограничивает размер строки запроса и каждого отдельного заголовка). Таким образом, это говорит о том, что nginx допускает где-то между 16-32k (я предполагаю, что одну строку нельзя разделить на два буфера, поэтому буферы могут быть заполнены не полностью).
Лили Баллард
добавление значения в apache 2.4, которое остается прежним: httpd.apache.org/docs/2.4/mod/core.html#limitrequestfieldsize : Apache 2.0, 2.2,2.4: 8K
Med Ali Difallah
5

HTTP не устанавливает предопределенного ограничения на длину каждого поля заголовка или на длину раздела заголовка в целом, как описано в разделе 2.5. На практике встречаются различные специальные ограничения на длину отдельного поля заголовка, часто в зависимости от конкретной семантики поля.

Значения заголовка HTTP ограничены реализациями сервера. Спецификация Http не ограничивает размер заголовка.

Сервер, который получает поле заголовка запроса или набор полей, размер которых больше, чем он хочет обработать, ДОЛЖЕН ответить соответствующим кодом состояния 4xx (Ошибка клиента). Игнорирование таких полей заголовка увеличило бы уязвимость сервера для запроса атак контрабанды (Раздел 9.5).

Большинство серверов вернут 413 Entity Too Largeили исправят ошибку 4xx, когда это произойдет.

Клиент МОЖЕТ отбросить или усечь полученные поля заголовка, которые больше, чем клиент желает обработать, если семантика поля такова, что отброшенные значения могут быть безопасно проигнорированы без изменения рамок сообщения или семантики ответа.

Неограниченный размер заголовка HTTP защищает сервер от атак и может снизить его способность обслуживать органический трафик.

Источник

realPK
источник
2

Вот предел самого популярного веб-сервера

  • Апач - 8К
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Tomcat - 8K - 48K
Сарат Ак
источник
1

Я также обнаружил, что в некоторых случаях причиной 502/400 в случае многих заголовков может быть большое количество заголовков независимо от их размера. из документов

tune.http.maxhdr Устанавливает максимальное количество заголовков в запросе. Когда запрос приходит с числом заголовков, превышающим это значение (включая первую строку), он отклоняется кодом состояния «400 неверных запросов». Аналогично, слишком большие ответы блокируются с помощью «502 Bad Gateway». Значение по умолчанию - 101, что достаточно для всех случаев использования, учитывая, что широко развернутый сервер Apache использует тот же лимит. Может быть полезно увеличить этот предел, чтобы временно позволить приложению с ошибками работать к тому времени, когда оно будет исправлено. Имейте в виду, что каждый новый заголовок потребляет 32 бита памяти для каждой сессии, поэтому не устанавливайте этот предел слишком высоким.

https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr

Шей Рыбак
источник