Могут ли заголовки HTTP быть слишком большими для браузеров?

Я создаю AJAX-приложение, которое использует HTTP-контент и HTTP-заголовок для отправки и получения данных. Есть ли момент, когда данные, полученные из заголовка HTTP, не будут прочитаны браузером, потому что они слишком большие? Если да, то каков предел и одинаковое ли поведение во всех браузерах?

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


Спасибо за весь вклад по этому вопросу, он был очень ценным и интересным. Ответ Томаса получил награду, но ответ Джона Ханны поднял очень хороший вопрос о доверенности.

5 ответов

Решение

На практике, хотя существуют правила, запрещающие прокси-серверам не пропускать определенные заголовки (на самом деле, достаточно четкие правила, по которым можно изменять, и даже то, как информировать прокси-сервер о том, может ли он изменить новый заголовок, добавленный более поздним стандартом), это только применяется к "прозрачным" прокси, и не все прокси являются прозрачными. В частности, некоторые стереть заголовки они не понимают как намеренную практику безопасности.

Кроме того, на практике некоторые ведут себя неправильно (хотя дела обстоят намного лучше, чем были).

Таким образом, помимо очевидных заголовков ядра, количество информации заголовка, от которой вы можете зависеть при передаче с сервера на клиент, равно нулю.

Это только одна из причин, по которой вы никогда не должны зависеть от того, правильно ли используются заголовки (например, будьте готовы к тому, чтобы клиент повторил запрос на то, что он должен был кэшировать, или к серверу для отправки всей сущности, когда вы запрашиваете диапазон), за исключением очевидного случая заголовков аутентификации (по принципу отказоустойчивости).

Короткие ответы:

Такое же поведение: нет

Самый низкий предел найден в популярных браузерах:

  • 10 КБ за заголовок
  • 256 КБ для всех заголовков в одном ответе.

Результаты тестирования MacBook под управлением Mac OS X 10.6.4:

Самый большой ответ успешно загружен, все данные в одном заголовке:

  • Опера 10: 150 МБ
  • Safari 5: 20 МБ
  • IE 6 через Wine: 10 МБ
  • Chrome 5: 250 КБ
  • Firefox 3.6: 10 КБ

Примечание. Эти возмутительные большие заголовки в Opera, Safari и IE заняли минуты.

Примечание для Chrome: фактический предел составляет 256 КБ для всего заголовка HTTP. Появляется сообщение об ошибке: "Ошибка 325 (net::ERR_RESPONSE_HEADERS_TOO_BIG): неизвестная ошибка".

Примечание для Firefox: при отправке данных через несколько заголовков 100 МБ работали нормально, просто разделите более 10 000 заголовков.

Мой вывод: если вы хотите поддерживать все популярные браузеры, 10 КБ на заголовок кажется ограничением и 256 КБ для всех заголовков вместе взятых.

Мой код PHP используется для генерации этих ответов:

<?php

ini_set('memory_limit', '1024M');
set_time_limit(90);
$header = "";

$bytes = 256000;

for($i=0;$i<$bytes;$i++) {
    $header .= "1";
}

header("MyData: ".$header);
/* Firfox multiple headers
for($i=1;$i<1000;$i++) {
    header("MyData".$i.": ".$header);
}*/

echo "Length of header: ".($bytes / 1024).' kilobytes';

?>

Две вещи.

Прежде всего, почему бы просто не запустить тест, который дает браузеру все больше и больше заголовков и ждать, пока он не достигнет числа, которое не работает? Просто запустите его один раз в каждом браузере. Это самый верный способ понять это. Даже если это не совсем исчерпывающе, у вас есть хотя бы несколько практических цифр, и эти цифры, вероятно, охватят подавляющее большинство ваших пользователей.

Во-вторых, я согласен со всеми, говоря, что это плохая идея. Не должно быть трудно найти другое решение, если вы действительно заинтересованы в достижении предела. Даже если вы проводите тестирование в каждом браузере, все равно есть брандмауэры и т. Д., О которых нужно беспокоиться, и нет абсолютно никакого способа проверить каждую комбинацию (и я почти уверен, что никто другой не делал этого до вас), Вы не сможете получить жесткий лимит для каждого случая.

Хотя в теории все это должно работать нормально, позже может случиться тот крайний случай, который кусает вас в задницу, если вы решите это сделать.

TL; DR: это плохая идея. Избавьте себя от проблем и найдите реальное решение вместо обходного пути.


Изменить: Поскольку вы упоминаете, что запросы могут поступать из нескольких типов источников, почему бы просто не указать источник в заголовке запроса и полностью сохранить данные в теле? Есть какой-то Source или же ClientType поле в заголовке, которое указывает, откуда поступает запрос. Если это исходит из браузера, включите HTML в тело; если это происходит из приложения PHP, поместите туда некоторые специфичные для PHP вещи; и т. д. и т. д. Если поле пустое, не добавляйте никаких дополнительных данных вообще.

RFC для HTTP/1.1 явно не ограничивает длину заголовков или тела.

Согласно этой странице современные браузеры (Firefox, Safari, Opera), за исключением IE, могут обрабатывать очень длинные URI: http://www.boutell.com/newfaq/misc/urllength.html. Я знаю, что это отличается от получения заголовков, но, по крайней мере, показывает, что они могут создавать и отправлять огромные HTTP-запросы (возможно, неограниченной длины).

Если в браузерах есть какие-либо ограничения, то это будет что-то вроде размера доступной памяти или предела типа переменной и т. Д.

Теоретически, нет ограничений на количество данных, которые могут быть отправлены в браузере. Это почти то же самое, что сказать, что количество содержимого, которое может быть в теле веб-страницы, ограничено.

Если возможно, попробуйте передать данные через тело документа. Чтобы быть в безопасности, рассмотрите возможность разделения данных на несколько проходов для загрузки.

Другие вопросы по тегам