Обзор изменений Nginx 1.26
С выпуском Nginx 1.26 было внесено несколько важных изменений для повышения безопасности и обеспечения соответствия стандартам HTTP. Ниже приведены ключевые обновления:
Обработка пробелов в именах и значениях заголовков
Для повышения безопасности было усилено соблюдение RFC 7230, особенно в отношении обработки пробелов в заголовках. Более подробную информацию об этих изменениях можно найти в Приложении .
Обработка заголовков Content-Length
и Transfer-Encoding
Один из распространенных методов, используемых при атаках с контрабандой запросов, включает отправку HTTP-запросов с заголовками Content-Length
и Transfer-Encoding
. Хотя Apigee Edge уже был защищен от таких атак, Nginx теперь явно блокирует запросы, содержащие оба заголовка. Если такой запрос будет отправлен, Nginx ответит ошибкой 400 Bad Request .
Поддерживаемые шифры
Список поддерживаемых шифров для северных запросов может измениться в этом выпуске. Вы можете проверить шифры, поддерживаемые OpenSSL, на хосте вашего маршрутизатора, чтобы получить обновленный список доступных шифров.
Поддерживаемые размеры ключей
Ранее по умолчанию принимались ключи RSA, DSA и DH размером менее 2048 бит, а также ключи ECC размером менее 224 бит. Однако в этом обновлении такие ключи больше не будут разрешены как для односторонних, так и для двусторонних TLS-соединений для запросов на север.
Приложение
Пробелы в заголовках
Есть три основных изменения:
- Некоторые имена заголовков, которые ранее были разрешены, теперь запрещены Nginx 1.26. Запросы с этими заголовками приведут к ошибке 400 Bad Request .
- Некоторые значения заголовков, которые ранее были разрешены, теперь запрещены Nginx 1.26. Запросы с этими заголовками также приведут к ошибке 400 Bad Request .
- Некоторые заголовки, которые ранее принимались Nginx, но вызывали сбои в дальнейшем в обработчике сообщений, теперь отклоняются напрямую Nginx. Хотя эти заголовки по-прежнему приводят к сбоям API, сообщения об ошибках HTTP изменятся.
В разделе ниже приведены примеры различных запрещенных имен и значений заголовков. Это только примеры и, возможно, не являются исчерпывающим списком. Для заголовков рекомендуется придерживаться рекомендаций RFC 7230.
Изменения в названиях заголовков
В этом разделе перечислены различные имена заголовков, которые были разрешены в Nginx 1.20.1, но теперь запрещены в Nginx 1.26.
Сценарий | Примеры названий заголовков |
---|---|
Управляющий символ в начале, конце или между именем заголовка. | { '\u0001'Заголовок0, Значение0 } { Заголовок6'\u0002', Значение6 } { Заголовок'\u0005'4, Значение4 } |
Ведущие и конечные пробелы в имени заголовка | {"Заголовок2", "Значение2"} {" Заголовок3", "Значение3"} {"Заголовок4", "Значение4"} |
Начальный и конечный HTAB в имени заголовка | {"\tHeader11", "Value11"} {"Заголовок12\t", "Значение12"} {"\tHeader13\t", "Value13"} |
Начальная и конечная комбинация HTAB и WS в имени заголовка. | {"\t Заголовок24", "Значение24"} {" \tHeader25", "Value25"} {"Заголовок26\t", "Значение26"} {"Заголовок27\t", "Значение27"} |
NewLine (\n) между именем заголовка, за которым сразу следует WS или серия WS. | {"Заголовок\n 57Mutiline", "Value57"} {"Заголовок\n 58Mutiline", "Value58"} |
Новая строка (\n) между именем заголовка, за которой сразу следует HTAB или серия HTAB. | {"Заголовок\n\t73", "Значение73"} {"Заголовок\n\t\t74", "Значение74"} |
Возврат каретки (\r) Новая строка (\n) между именем заголовка, за которым сразу следует HTAB или серия HTAB. | {"Заголовок\r\n\t69", "Значение69"} {"Заголовок\r\n\t\t70", "Значение70"} |
Возврат каретки (\r) Новая строка (\n) между именем заголовка, за которым сразу следует WS или серия WS | {"Заголовок\r\n 71", "Значение71"} {"Заголовок\r\n 72", "Значение72"} |
Изменения в значениях заголовка
В этом разделе показаны различные значения заголовков, которые были разрешены в Nginx 1.20.1, но запрещены в Nginx 1.26.
Сценарий | Примеры |
---|---|
\r\n или комбинация \r\n с WS или HTAB допускается между HEADERVALUE | {"Header47", "Value47\r\n MultiLine"}, {"Header48", "Value48\r\n MultiLine"}, {"Header49b", "Value49b\r\n \r\nMultiLine"}, {"Header50", "Value50 \r\n MultiLine"}, {"Header51", "Value51\r\n\tMultiLine"}, {"Header52", "Value52\r\n\t\tMultiLine"}, {"Header53", "Value53\t\r\n\tMultiLine"} |
\n или комбинация \n с WS или HTAB допускается между HEADERVALUE | {"Header61", "Value\n 61Multiline"}, {"Header62", "Value\n 63Multiline"}, {"Заголовок65", "Значение\n\t65"}, {"Заголовок66", "Значение\n\t\t66"}, {"Заголовок67", "Значение\n 67"}, {"Заголовок68", "Значение\n 68"} |
Изменение ответа об ошибке HTTP
В этом разделе рассматриваются заголовки, которые были разрешены старым Nginx, но отклонены вышестоящим обработчиком сообщений, что привело к коду состояния 400. Однако в Nginx 1.26 такие заголовки вызывают сбои непосредственно в Nginx, не позволяя пересылать запрос обработчику сообщений.
Для клиентов, отправляющих такие заголовки, код состояния HTTP останется 400. Однако тело ответа HTTP может измениться, поскольку ошибка теперь будет генерироваться Nginx, а не обработчиком сообщений.
Сценарий | Примеры |
---|---|
HTAB или WS между HEADERNAME Процессор сообщений отклоняет такие запросы. В Nginx 1.26 эти запросы будут отклоняться самим Nginx. Потребитель API получит ответ об ошибке 400 с сообщением об ошибке Nginx в теле. | {"Заголовок 5", "Значение5"}, {"Заголовок\t14", "Значение14"}, {"Заголовок\t 32", "Значение32"}, {"Заголовок \t33", "Значение33"}, {"Заголовок-36", "Значение36"}, {"Заголовок-\t40", "Значение40"}, {"Заголовок 4а", "Значение4а"}, {"Заголовок\t 59", "Значение59"}, {"Заголовок\t 60", "Значение60"} |