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


326

Чи існує максимально допустимий розмір заголовків HTTP? Якщо так, то що це? Якщо ні, то це щось конкретно для сервера чи прийнятий стандарт, щоб дозволяти заголовки будь-якого розміру?

Відповіді:


316

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

Пов'язане запитання: Наскільки великою може стати рядок агента користувача?


10
У цій відповіді зазначено, що максимально прийнятий розмір заголовка сервером. Але який максимальний розмір заголовка може надіслати веб-сервер (наприклад, Apache)?
Pacerier

@Pacerier: Це 8175 байт для Apache, схоже, але я все ще шукаю. Також не сподівайтеся на отримання корисних повідомлень про помилки, якщо ви зіткнетеся з такою межею з будь-якого бэкенду, який є.
хакре

2
@hakre: IIRC, 8K для всього рядка, рахуючи цілі рядки заголовків (назви заголовків, пробіли та корисні навантаження заголовків).
vartec

Чи є спосіб визначити нестандартний максимальний розмір заголовка?
Судіп Болахе

Ймовірно, IIS відкритий до 16 к. Через вимоги протоколів SPNego та Kerberos, і вони часто використовуються для "автентифікації Windows".
Ронан Кердуду

220

Як говорить vartec вище, специфікація HTTP не визначає межу, проте багато серверів роблять за замовчуванням. Це означає, практично кажучи, нижня межа - 8K . Для більшості серверів цей ліміт застосовується до суми рядка запиту та ВСІХ полів заголовка (тому тримайте файли cookie короткими).

Варто зазначити, що nginx за замовчуванням використовує розмір системної сторінки, який у більшості систем становить 4K. Ви можете перевірити за допомогою цієї крихітної програми:

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
Кукі мають окремий загальний граничний розмір 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 утримує сервер під впливом атак і може знизити його здатність обслуговувати органічний трафік.

Джерело


2

Ось межа найбільш популярного веб-сервера

  • Apache - 8K
  • Nginx - 4K-8K
  • IIS - 8K-16K
  • Томат - 8К - 48К

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.