YARP Docsv2.3
Документация/Безопасность/Рекомендации по HTTP-заголовкам

Рекомендации по HTTP-заголовкам

Заголовки — очень важная часть обработки HTTP-запросов, и у каждого из них есть собственная

Заголовки — очень важная часть обработки HTTP-запросов, и у каждого из них есть собственная семантика и свои особенности. Большинство заголовков по умолчанию проксируются, хотя некоторые заголовки, управляющие способом доставки запроса, автоматически изменяются или удаляются прокси-сервером. Соединения между клиентом и прокси-сервером и между прокси-сервером и узлом назначения независимы друг от друга. Поэтому заголовки, влияющие на соединение и транспорт, необходимо фильтровать. Многие заголовки содержат такую информацию, как имена доменов, пути и другие сведения, которые могут измениться при включении обратного прокси-сервера в архитектуру приложения. Ниже приведён набор рекомендаций о том, как это может повлиять на конкретные заголовки и что с этим делать.

Фильтрация заголовков в YARP

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

Connection , KeepAlive , Close

Эти заголовки управляют тем, как обрабатывается TCP-соединение, и удаляются, чтобы не повлиять на соединение по другую сторону прокси-сервера.

Transfer-Encoding

Этот заголовок описывает формат тела запроса или ответа при передаче по сети, например 'chunked', и удаляется, поскольку формат может различаться для внутреннего и внешнего соединения. Входящий и исходящий стек HTTP при необходимости самостоятельно добавит транспортные заголовки.

TE

Через прокси-сервер пропускается только значение заголовка TE: trailers, поскольку оно требуется для некоторых реализаций gRPC.

Upgrade

Этот заголовок используется для таких протоколов, как WebSockets. По умолчанию он удаляется и добавляется обратно только для протоколов, поддержка которых реализована явно (WebSockets, SPDY).

Proxy-*

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

Alt-Svc

Этот заголовок ответа используется при переходе на HTTP/3 и применяется только к непосредственному соединению.

Заголовки распределённой трассировки

К ним относятся заголовки TraceParent , Request-Id , TraceState , Baggage и Correlation- Context .

Они автоматически удаляются на основе DistributedContextPropagator.Fields, что позволяет пересылающему HttpClient заменить их на актуальные значения.

Чтобы отключить изменение этих заголовков, установите для SocketsHttpHandler.ActivityHeadersPropagator значение null :

C#   services.AddReverseProxy()
          .ConfigureHttpClient((_, handler) => handler.ActivityHeadersPropagator =
   null);

Strict-Transport-Security

Этот заголовок указывает клиентам всегда использовать HTTPS, однако между значениями, предоставленными прокси-сервером и узлом назначения, может возникнуть конфликт. Во избежание путаницы значение от узла назначения не копируется в ответ, если оно уже было добавлено в ответ приложением прокси-сервера.

Другие рекомендации по заголовкам

Host

Заголовок Host указывает, для какого сайта на сервере предназначен запрос. По умолчанию этот заголовок удаляется, поскольку имя узла, публично используемое прокси-сервером, скорее всего, отличается от имени, которое использует служба за прокси-сервером. Это поведение можно настроить с помощью преобразования RequestHeaderOriginalHost.

X-Forwarded-* , Forwarded

Поскольку для взаимодействия с узлом назначения используется отдельное соединение, эти заголовки запроса можно использовать для передачи информации об исходном соединении, такой как IP-адрес, схема, порт и клиентский сертификат. Заголовки X-Forwarded-For , X-Forwarded-Proto , X-Forwarded-Host и X-Forwarded-Prefix включены по умолчанию. Эта информация подвержена атакам подмены (spoofing), поэтому по умолчанию любые уже существующие в запросе заголовки такого рода удаляются и заменяются новыми. Приложению назначения следует с осторожностью относиться к степени доверия этим значениям. Сведения о настройке этих заголовков на прокси-сервере см. в разделе о преобразованиях. Рекомендации по настройке приложения назначения для чтения этих заголовков см. в статье о настройке ASP.NET Core для работы с прокси-серверами и балансировщиками нагрузки.

X-http-method-override , x-http-method , x-method-override

Некоторые клиенты и серверы ограничивают набор допустимых HTTP-методов (например, GET). Эти заголовки запроса иногда используются для обхода таких ограничений. По умолчанию они проксируются. Если требуется предотвратить подобный обход на прокси-сервере, используйте преобразование RequestHeaderRemove.

Этот заголовок ответа может содержать поля, ограничивающие такие аспекты URL-адреса, как схема, домен или путь, для которых должен использоваться cookie-файл. Использование обратного прокси-сервера может изменить фактическую схему, домен или путь сайта с точки зрения внешнего наблюдателя. Хотя переписать cookie-файлы ответа с помощью пользовательских преобразований технически возможно, вместо этого мы рекомендуем использовать описанные выше заголовки Forwarded, чтобы передать правильные значения приложению назначения, позволив ему самостоятельно сформировать корректные заголовки set-cookie.

Location

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

Server

Этот заголовок ответа указывает, какая серверная технология использовалась для формирования ответа (например, IIS, Kestrel). По умолчанию этот заголовок проксируется от узла назначения. Приложения, которые хотят его удалить, могут использовать преобразование ResponseHeaderRemove — в этом случае будет использован

заголовок сервера, заданный самим прокси-сервером по умолчанию. Подавление заголовка сервера по умолчанию у прокси-сервера — это специфичная для конкретного сервера операция,

например, для Kestrel.

X-Powered-By

Этот заголовок ответа указывает, какой веб-фреймворк использовался для формирования ответа (например, ASP.NET). ASP.NET Core не создаёт этот заголовок, но IIS может его добавлять. По умолчанию этот заголовок проксируется от узла назначения. Приложения, которые хотят его удалить, могут использовать преобразование ResponseHeaderRemove.

Примечание

Эта статья создана автором с использованием ИИ. Подробнее

Адаптировано из Microsoft Learn , лицензия CC BY 4.0 .