Максимум на значениях заголовка http?
Существует ли допустимый максимально допустимый размер для заголовков HTTP? Если так, то, что это? Если нет, то является ли это чем-то конкретным для сервера или общепринятым стандартом, разрешающим заголовки любого размера?
7 ответов
Нет, HTTP не определяет никаких ограничений. Однако большинство веб-серверов ограничивают размер принимаемых ими заголовков. Например, в Apache ограничение по умолчанию составляет 8 КБ, в IIS - 16 КБ. Сервер вернется 413 Entity Too Large
ошибка, если размер заголовков превышает этот предел.
Смежный вопрос: насколько большой может получить строка агента пользователя?
Как сказано выше в vartec, спецификация HTTP не определяет ограничение, однако многие серверы устанавливают его по умолчанию. Это означает, что, практически говоря, нижний предел составляет 8K. Для большинства серверов это ограничение применяется к сумме строки запроса и ВСЕХ полей заголовка (поэтому держите ваши куки короткими).
- Apache 2.0, 2.2: 8K
- Nginx: 4K - 8K
- IIS: зависит от версии, 8K - 16K
- Tomcat: зависит от версии, 8K - 48K (?!)
Стоит отметить, что 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.
Вот предел самого популярного веб-сервера
- Apache - 8 КБ
- Nginx - 4К-8К
- IIS - 8K-16K
- Tomcat - 8– 48 тыс.
HTTP не устанавливает предопределенного ограничения на длину каждого поля заголовка или на длину раздела заголовка в целом, как описано в разделе 2.5. На практике встречаются различные специальные ограничения на длину отдельного поля заголовка, часто в зависимости от конкретной семантики поля.
Значения заголовка HTTP ограничены реализациями сервера. Спецификация Http не ограничивает размер заголовка.
Сервер, который получает поле заголовка запроса или набор полей, больше, чем он хочет обработать, ДОЛЖЕН ответить соответствующим кодом состояния 4xx (Ошибка клиента). Игнорирование таких полей заголовка увеличило бы уязвимость сервера для запроса атак контрабанды (Раздел 9.5).
Большинство серверов вернется 413 Entity Too Large
или соответствующая ошибка 4xx, когда это происходит.
Клиент МОЖЕТ отбросить или усечь полученные поля заголовка, которые больше, чем клиент желает обработать, если семантика поля такова, что отброшенные значения могут быть безопасно проигнорированы без изменения рамок сообщения или семантики ответа.
Неограниченный размер заголовка HTTP защищает сервер от атак и может снизить его способность обслуживать органический трафик.
RFC 6265 от 2011 года устанавливает определенные ограничения на использование файлов cookie.
https://tools.ietf.org/html/rfc62656.1. Пределы
Практические реализации пользовательских агентов имеют ограничения на количество и размер файлов cookie, которые они могут хранить. Пользовательские агенты общего назначения ДОЛЖНЫ обеспечивать каждую из следующих минимальных возможностей:
o Не менее 4096 байт на файл cookie (измеряется как сумма длины имени, значения и атрибутов файла cookie).
o Не менее 50 файлов cookie на домен.
o Всего не менее 3000 файлов cookie.
Серверам СЛЕДУЕТ использовать как можно меньше файлов cookie, чтобы избежать достижения этих ограничений реализации и минимизировать пропускную способность сети из-за того, что заголовок Cookie включается в каждый запрос.
Серверы ДОЛЖНЫ корректно ухудшаться, если пользовательский агент не может вернуть один или несколько файлов cookie в заголовке cookie, потому что агент пользователя может удалить любой файл cookie в любое время по приказу пользователя.
-
Целевая аудитория RFC - это то, что должно поддерживаться пользовательским агентом или сервером. Похоже, что для настройки вашего сервера для поддержки того, что позволяет браузер, вам необходимо настроить 4096*50 в качестве ограничения. Как следует из следующего текста, это действительно намного превышает то, что требуется для типичного веб-приложения. Было бы полезно использовать текущий предел и верхний предел, описанный в RFC, и сравнить последствия для памяти и ввода-вывода более высокой конфигурации.
Я также обнаружил, что в некоторых случаях причиной 502/400 для многих заголовков может быть большое количество заголовков независимо от их размера. из документов
tune.http.maxhdr Устанавливает максимальное количество заголовков в запросе. Когда запрос приходит с числом заголовков, превышающим это значение (включая первую строку), он отклоняется с кодом состояния "400 неправильных запросов". Аналогично, слишком большие ответы блокируются с помощью "502 Bad Gateway". Значение по умолчанию - 101, что достаточно для всех случаев использования, учитывая, что широко развернутый сервер Apache использует тот же лимит. Может быть полезно продвинуть этот предел дальше, чтобы временно позволить приложению с ошибками работать к тому времени, когда оно будет исправлено. Имейте в виду, что каждый новый заголовок потребляет 32 бита памяти для каждой сессии, поэтому не устанавливайте этот предел слишком высоким.
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html
Если вы собираетесь использовать любого поставщика DDOS, такого как Akamai, у них есть максимальное ограничение на размер заголовка ответа 8 КБ. Поэтому, по сути, постарайтесь ограничить размер заголовка ответа ниже 8 КБ.