Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Сжатие HTTP - это возможность, которая может быть встроена в веб-серверы и веб-клиенты для повышения скорости передачи и использования полосы пропускания. [1]

Данные HTTP сжимаются перед отправкой с сервера: совместимые браузеры сообщают серверу, какие методы поддерживаются, перед загрузкой правильного формата; браузеры, не поддерживающие соответствующий метод сжатия, будут загружать несжатые данные. Наиболее распространенные схемы сжатия включают gzip и Brotli ; однако полный список доступных схем поддерживается IANA . [2]

Есть два разных способа сжатия в HTTP. На более низком уровне поле заголовка Transfer-Encoding может указывать, что полезная нагрузка сообщения HTTP сжата. На более высоком уровне поле заголовка Content-Encoding может указывать на то, что ресурс, который передается, кэшируется или используется иным образом, сжимается. Сжатие с использованием Content-Encoding поддерживается более широко, чем Transfer-Encoding, и некоторые браузеры не рекламируют поддержку сжатия Transfer-Encoding, чтобы избежать появления ошибок на серверах. [3]

Согласование схемы сжатия [ править ]

Согласование выполняется в два этапа, описанных в RFC 2616:

1. Веб-клиент объявляет, какие схемы сжатия он поддерживает, включая список токенов в HTTP-запрос . Для Content-Encoding список находится в поле под названием Accept-Encoding ; для кодирования передачи это поле называется TE .

GET  / encrypted-area  HTTP / 1.1 Хост :  www.example.com Accept-Encoding :  gzip, deflate

2. Если сервер поддерживает одну или несколько схем сжатия, исходящие данные могут быть сжаты одним или несколькими методами, поддерживаемыми обеими сторонами. В этом случае сервер добавит поле Content-Encoding или Transfer-Encoding в HTTP-ответ с используемыми схемами, разделенными запятыми.

HTTP / 1.1  200  OK Дата :  пн, 26 июня 2016 22:38:34 GMT Сервер :  Apache / 1.3.3.7 (Unix) (Red-Hat / Linux) Последнее изменение :  среда, 8 января 2003 г., 23:11:55 GMT Accept-Ranges :  байты Content-Length :  438 Connection :  close Content-Type :  text / html; charset = Кодировка содержимого UTF-8 : gzip 

Веб - сервер отнюдь не обязаны использовать любой метод сжатия - это зависит от внутренних настроек веб - сервера , а также может зависеть от внутренней архитектуры сайта в вопросе.

Маркеры кодирования содержимого [ править ]

Официальный список токенов, доступных для серверов и клиентов, поддерживается IANA, [4] и включает:

  • br - Brotli , алгоритм сжатия, специально разработанный для кодирования содержимого HTTP, определенный в RFC 7932 и реализованный во всех основных современных браузерах.
  • compress - программный метод "сжатия" UNIX (исторический; устарел в большинстве приложений и заменен на gzip или deflate)
  • deflate - сжатие на основе алгоритма deflate (описанного в RFC 1951), комбинации алгоритма LZ77 и кодирования Хаффмана, заключенного в формат данных zlib (RFC 1950);
  • exi - Эффективный обмен XML W3C
  • gzip - zip-формат GNU (описан в RFC 1952). Для сжатия используется алгоритм deflate , но формат данных и алгоритм контрольной суммы отличаются от кодирования содержимого deflate. Этот метод получил наибольшую поддержку по состоянию на март 2011 г. [5]
  • идентичность - преобразование не используется. Это значение по умолчанию для кодирования содержимого.
  • pack200-gzip - Формат сетевой передачи для архивов Java [6]
  • - zstd Zstandard сжатие, определенный в RFC 8478

В дополнение к этому, ряд неофициальных или нестандартных токенов широко используются серверами или клиентами:

  • bzip2 - сжатие на основе бесплатного формата bzip2, поддерживаемого lighttpd [7]
  • lzma - сжатие на основе (raw) LZMA доступно в Opera 20, а в elinks через параметр времени компиляции [8]
  • peerdist [9] - кэширование и получение содержимого однорангового узла Microsoft
  • rsync [10] - дельта-кодирование в HTTP , реализуемое парой прокси-серверов rproxy .
  • xpress - протокол сжатия Microsoft, используемый Windows 8 и более поздними версиями для обновлений приложений Магазина Windows. Сжатие на основе LZ77, возможно, с использованием кодировки Хаффмана. [11]
  • xz - сжатие контента на основе LZMA2, поддерживаемое неофициальным патчем Firefox; [12] и полностью реализован в mget с 31 декабря 2013 года. [13]

Серверы, поддерживающие сжатие HTTP [ править ]

  • SAP NetWeaver
  • Microsoft IIS : встроенный или с использованием стороннего модуля
  • HTTP-сервер Apache через mod_deflate (несмотря на его название, поддерживает только gzip [14] ) и mod_brotli.
  • HTTP-сервер Hiawatha : обслуживает предварительно сжатые файлы [15]
  • HTTP-сервер Cherokee , сжатие на лету gzip и deflate
  • Веб-сервер Oracle iPlanet
  • Веб-сервер Zeus
  • lighttpd , через mod_compress и более новый mod_deflate (1.4.42+)
  • nginx - встроенный
  • Приложения на основе Tornado , если для «compress_response» установлено значение «Истина» в настройках приложения (для версий до 4.0 установите для «gzip» значение «Истина»)
  • Jetty Server - встроенный в службу статического контента по умолчанию и доступный через конфигурации фильтра сервлетов.
  • GeoServer
  • Apache Tomcat
  • IBM Websphere
  • AOLserver
  • Ruby Rack через промежуточное ПО Rack :: Deflater
  • HAProxy
  • Лак - встраиваемый. Также работает с ESI
  • Armeria - обслуживание предварительно сжатых файлов [16]


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

Проблемы, препятствующие использованию сжатия HTTP [ править ]

В статье 2009 года инженеров Google Арвинда Джейна и Джейсона Глазго говорится, что более 99 человеко-лет ежедневно тратятся [17] из-за увеличения времени загрузки страницы, когда пользователи не получают сжатый контент. Это происходит, когда антивирусное программное обеспечение мешает соединениям, чтобы заставить их быть несжатыми, когда используются прокси (с чрезмерно осторожными веб-браузерами), когда серверы настроены неправильно и когда ошибки браузера не позволяют использовать сжатие. Internet Explorer 6, который переходит на HTTP 1.0 (без таких функций, как сжатие или конвейерная обработка) при использовании прокси-сервера - обычная конфигурация в корпоративных средах - был основным браузером, наиболее склонным к отказу от несжатого HTTP. [17]

Другая проблема, обнаруженная при развертывании сжатия HTTP в больших масштабах, связана с определением кодировки deflate : в то время как HTTP 1.1 определяет кодировку deflate как данные, сжатые с deflate (RFC 1951) внутри потока в формате zlib (RFC 1950), серверные и клиентские продукты Microsoft исторически реализовал его как «сырой» спущенный поток [18], что сделало его развертывание ненадежным. [19] [20] По этой причине некоторые программы, включая HTTP-сервер Apache, реализуют только кодирование gzip .

Последствия для безопасности [ править ]

Сжатие позволяет выполнить определенную форму атаки с выбранным открытым текстом : если злоумышленник может внедрить любой выбранный контент на страницу, он может узнать, содержит ли страница данный контент, наблюдая за увеличением размера зашифрованного потока. Если увеличение меньше, чем ожидалось для случайных инъекций, это означает, что компрессор обнаружил повторение в тексте, т. Е. Введенный контент перекрывает секретную информацию. Это идея CRIME.

В 2012 году была объявлена ​​общая атака на использование сжатия данных под названием CRIME . Хотя атака CRIME могла эффективно работать против большого количества протоколов, включая, помимо прочего, TLS, и протоколы прикладного уровня, такие как SPDY или HTTP, были продемонстрированы эксплойты только против TLS и SPDY, и в браузерах и серверах они были в значительной степени уменьшены. Эксплойт CRIME против HTTP-сжатия вообще не был устранен, хотя авторы CRIME предупредили, что эта уязвимость может быть даже более распространенной, чем сжатие SPDY и TLS вместе взятые.

В 2013 году был опубликован новый пример CRIME-атаки на HTTP-сжатие, получивший название BREACH. Атака BREACH может извлекать токены входа, адреса электронной почты или другую конфиденциальную информацию из зашифрованного TLS веб-трафика всего за 30 секунд (в зависимости от количества байтов, которые нужно извлечь), при условии, что злоумышленник обманом заставляет жертву перейти по вредоносной веб-ссылке. [21] Все версии TLS и SSL подвержены риску BREACH независимо от используемого алгоритма шифрования или шифра. [22] В отличие от предыдущих случаев CRIME, от которого можно успешно защититься, отключив сжатие TLS или сжатие заголовков SPDY, BREACH использует сжатие HTTP, которое невозможно отключить, поскольку практически все веб-серверы полагаются на него для повышения скорости передачи данных для пользователей. [21]

По состоянию на 2016 год, атака TIME и атака HEIST стали достоянием общественности. [23] [24] [25] [26]

Ссылки [ править ]

  1. ^ «Использование сжатия HTTP (IIS 6.0)» . Корпорация Microsoft . Проверено 9 февраля 2010 года .
  2. ^ RFC 2616, раздел 3.5: «Internet Assigned Numbers Authority (IANA) действует как реестр для токенов значений кодирования содержимого».
  3. ^ 'RFC2616 "Transfer-Encoding: gzip, chunked" неправильно обработан' , Chromium Issue 94730
  4. ^ «Параметры протокола передачи гипертекста - Реестр кодирования содержимого HTTP» . IANA . Проверено 18 апреля 2014 года .
  5. ^ «Испытания на сжатие: результаты» . Verve Studios, Ко Архивировано из оригинала 21 марта 2012 года . Проверено 19 июля 2012 года .
  6. ^ «JSR 200: Формат сетевой передачи для архивов Java» . Программа процесса сообщества Java.
  7. ^ "ModCompress - Lighttpd" . светлые лаборатории . Проверено 18 апреля 2014 года .
  8. ^ elinks LZMA декомпрессия
  9. ^ «[MS-PCCRTP]: Одноранговое кэширование и извлечение контента: расширения протокола передачи гипертекста (HTTP)» . Microsoft . Проверено 19 апреля 2014 года .
  10. ^ «rproxy: определение протокола для кодирования HTTP rsync» . rproxy.samba.org .
  11. ^ «[MS-XCA]: алгоритм сжатия Xpress» . Проверено 29 августа 2015 года .
  12. ^ "Сжатие LZMA2 - MozillaWiki" . Проверено 18 апреля 2014 года .
  13. ^ "Страница проекта mget GitHub" . Проверено 6 января 2017 года .
  14. ^ «mod_deflate - HTTP-сервер Apache версии 2.4 - Поддерживаемые кодировки» .
  15. ^ «Дополнительная часть руководства по веб-серверу Hiawatha» .
  16. ^ "Обслуживание статических файлов как часть документации Armeria" .
  17. ^ a b «Используйте сжатие, чтобы сделать Интернет быстрее» . Разработчики Google . Проверено 22 мая 2013 года .
  18. ^ "deflate - Почему основные веб-сайты используют gzip?" . Переполнение стека . Проверено 18 апреля 2014 года .
  19. ^ «Испытания на сжатие: о» . Verve Studios. Архивировано из оригинального 2 -го января 2015 года . Проверено 18 апреля 2014 года .
  20. ^ "Не ждать: HTTP-сжатие" . Zoompf Web Performance . Проверено 18 апреля 2014 года .
  21. ^ a b Гудин, Дэн (1 августа 2013 г.). «Угнать за 30 секунд: новая атака захватывает секреты со страниц, защищенных HTTPS» . Ars Technica . Condé Nast . Проверено 2 августа 2013 года .
  22. Лейден, Джон (2 августа 2013 г.). «Шаг в ПРОБЛЕМЫ: новая атака, разработанная для чтения зашифрованных веб-данных» . Реестр . Проверено 2 августа 2013 года .
  23. Салливан, Ник (11 августа 2016 г.). «ПРЕСТУПНОСТЬ, ВРЕМЯ, НАРУШЕНИЕ и НАБЛЮДЕНИЕ: Краткая история атак оракула сжатия на HTTPS» . Проверено 16 августа 2016 .
  24. ^ Гудин, Дэн (3 августа 2016 г.). «Эксплойт HEIST - новая атака крадет SSN, адреса электронной почты и многое другое со страниц HTTPS» . Проверено 16 августа 2016 .
  25. ^ Be'ery, Тал. «Совершенное преступление? ВРЕМЯ покажет» (PDF) .
  26. ^ Ванхуф, Мэти. «HEIST: HTTP-шифрованная информация может быть украдена через TCP-окна» (PDF) .

Внешние ссылки [ править ]

  • RFC 2616: протокол передачи гипертекста - HTTP / 1.1
  • Значения кодирования содержимого HTTP , предоставленные органом по присвоению номеров в Интернете
  • Сжатие с помощью lighttpd
  • Ужас программирования: сжатие HTTP в IIS 6.0
  • 15 секунд: сжатие веб-сайта на Wayback Machine (архивировано 16 июля 2011 г.)
  • Сжатие HTTP : страница ресурса основателя VIGOS AG Константина Рака.
  • Использование HTTP-сжатия , Мартин Браун из Server Watch
  • Использование HTTP-сжатия в PHP
  • Динамическое и статическое сжатие HTTP с помощью Apache httpd