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

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

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


Спасибо, для всего входа об этом вопросе, это очень ценилось и интересно. Ответ Thomas получил щедрость, но ответ Jon Hanna поднял очень положительную сторону у прокси.

17
задан Community 23 May 2017 в 11:54
поделиться

5 ответов

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

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

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

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

8
ответ дан 30 November 2019 в 10:22
поделиться

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

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

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

2
ответ дан 30 November 2019 в 10:22
поделиться

Две вещи.

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

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

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

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


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

4
ответ дан 30 November 2019 в 10:22
поделиться

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

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

1
ответ дан 30 November 2019 в 10:22
поделиться

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

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

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

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

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

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

  • Opera 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';

?>
42
ответ дан 30 November 2019 в 10:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: