Skip to content

Latest commit

 

History

History
354 lines (206 loc) · 29.7 KB

HTTP_Headers_Cheat_Sheet.md

File metadata and controls

354 lines (206 loc) · 29.7 KB

Шпаргалка по заголовкам безопасности HTTP-ответов

Введение

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

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

Заголовки безопасности

X-Frame-Options

Заголовок HTTP-ответа X-Frame-Options можно использовать для указания того, следует ли браузеру разрешать отображение страницы в <frame>, <iframe>, <embed> или <object>. Сайты могут использовать это, чтобы избежать атак кликовой подделки, убедившись, что их контент не встраивается на другие сайты.

Директива frame-ancestors в Политике безопасности контента (CSP) устарела для поддерживающих браузеров (источник).

Заголовок X-Frame-Options полезен только тогда, когда HTTP-ответ, в котором он включен, имеет что-то для взаимодействия (например, ссылки, кнопки). Если HTTP-ответ является перенаправлением или API, возвращающим данные JSON, X-Frame-Options не обеспечивает безопасности.

Рекомендации

Используйте директиву frame-ancestors в Политике безопасности контента (CSP), если это возможно.

Не разрешайте отображение страницы в фрейме.

X-Frame-Options: DENY

X-XSS-Protection

Заголовок HTTP-ответа X-XSS-Protection является функцией Internet Explorer, Chrome и Safari, которая останавливает загрузку страниц, когда обнаруживает атаки межсайтового скриптинга (XSS).

ПРЕДУПРЕЖДЕНИЕ: Хотя этот заголовок может защитить пользователей старых веб-браузеров, которые еще не поддерживают CSP, в некоторых случаях этот заголовок может создавать уязвимости XSS на в остальном безопасных веб-сайтах (источник).

Рекомендации

Используйте Политику безопасности контента (CSP), которая отключает использование встроенного JavaScript.

Не устанавливайте этот заголовок или явно отключите его.

X-XSS-Protection: 0

Подробнее см. Mozilla X-XSS-Protection.

X-Content-Type-Options

Заголовок HTTP-ответа X-Content-Type-Options используется сервером для указания браузерам, что MIME-типы, указанные в заголовках Content-Type, должны соблюдаться, а не угадываться.

Этот заголовок используется для блокировки определения MIME-типа браузерами, которое может преобразовывать неисполняемые MIME-типы в исполняемые MIME-типы (Атаки путаницы MIME).

Рекомендации

Установите заголовок Content-Type правильно на всех страницах сайта.

X-Content-Type-Options: nosniff

Referrer-Policy

Заголовок HTTP Referrer-Policy контролирует, сколько информации о реферере (отправленной через заголовок Referer) должно включаться в запросы.

Рекомендации

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

Referrer-Policy: strict-origin-when-cross-origin

  • ПРИМЕЧАНИЕ: Для получения дополнительной информации о настройке этого заголовка см. Mozilla Referrer-Policy.

Content-Type

Заголовок Content-Type используется для указания оригинального типа медиа-ресурса (до применения любого кодирования контента для отправки). Если он не установлен правильно, ресурс (например, изображение) может быть интерпретирован как HTML, что может создать уязвимости XSS.

Хотя рекомендуется всегда правильно устанавливать заголовок Content-Type, это будет представлять собой уязвимость только в том случае, если контент предназначен для отображения клиентом, а ресурс является ненадежным (предоставлен или изменен пользователем).

Рекомендации

Content-Type: text/html; charset=UTF-8

  • ПРИМЕЧАНИЕ: Атрибут charset необходим для предотвращения XSS на HTML страницах.
  • ПРИМЕЧАНИЕ: text/html может быть любым из возможных MIME-типа.

Set-Cookie

Заголовок HTTP-ответа Set-Cookie используется для отправки куки от сервера к пользовательскому агенту, чтобы пользовательский агент мог отправить его обратно на сервер позже. Для отправки нескольких куки следует отправить несколько заголовков Set-Cookie в одном ответе.

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

Рекомендации

Strict-Transport-Security (HSTS)

Заголовок HTTP-ответа Strict-Transport-Security (часто сокращаемый как HSTS) позволяет веб-сайту сообщить браузерам, что его следует использовать только через HTTPS, а не через HTTP.

Рекомендации

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload

  • ПРИМЕЧАНИЕ: Ознакомьтесь внимательно с тем, как работает этот заголовок, перед его использованием. Если заголовок HSTS неправильно настроен или возникают проблемы с используемым сертификатом SSL/TLS, законные пользователи могут оказаться заблокированными для доступа к сайту. Например, если заголовок HSTS установлен на очень долгий срок, а сертификат SSL/TLS истекает или аннулируется, пользователи могут не иметь доступа к сайту, пока срок действия заголовка HSTS не истечет.

Пожалуйста, ознакомьтесь с Чек-листом HTTP Strict Transport Security для получения дополнительной информации.

Expect-CT ❌

Заголовок Expect-CT позволяет сайтам согласиться на отчетность о требованиях к прозрачности сертификатов (CT). Поскольку основные клиенты теперь требуют квалификации CT, единственное оставшееся значение — это отчетность о таких событиях на указанное значение report-uri в заголовке. Этот заголовок теперь меньше касается принудительного применения и больше касается обнаружения/отчетности.

Рекомендации

Не используйте этот заголовок. Mozilla рекомендует избегать его и, если возможно, удалять из существующего кода.

Content-Security-Policy (CSP)

Content Security Policy (CSP) — это функция безопасности, которая используется для указания источника контента, который разрешено загружать на веб-сайте или в веб-приложении. Это дополнительный уровень безопасности, который помогает обнаруживать и смягчать определенные типы атак, включая межсайтовое скриптование (XSS) и атаки на ввод данных. Эти атаки используются для кражи данных, порчи сайта и распространения вредоносного ПО.

  • ПРИМЕЧАНИЕ: Этот заголовок актуален для страниц, которые могут загружать и интерпретировать скрипты и код, но может быть неуместен в ответах REST API, которые возвращают контент, не предназначенный для рендеринга.

Рекомендации

Политика безопасности контента сложна для настройки и поддержания. Для объяснения вариантов настройки, пожалуйста, читайте Чек-лист Content Security Policy.

Access-Control-Allow-Origin

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

Access-Control-Allow-Origin — это заголовок CORS (доступ к ресурсам с другого источника). Этот заголовок указывает, может ли ответ, к которому он относится, быть передан запрашивающему коду с указанного источника. Другими словами, если сайтA запрашивает ресурс у сайтаB, сайтB должен указать в заголовке Access-Control-Allow-Origin, что сайтA может получить этот ресурс; в противном случае доступ будет заблокирован из-за Политики одного источника (SOP).

Рекомендации

Если вы используете этот заголовок, устанавливайте конкретные источники вместо *. Ознакомьтесь с Access-Control-Allow-Origin для получения подробной информации.

Access-Control-Allow-Origin: https://yoursite.com

  • ПРИМЕЧАНИЕ: Использование * может быть необходимо в зависимости от ваших потребностей. Например, для общедоступного API, который должен быть доступен с любого источника, может потребоваться разрешение *.

Cross-Origin-Opener-Policy (COOP)

Заголовок HTTP-ответа Cross-Origin-Opener-Policy (COOP) позволяет убедиться, что главный документ не делится группой контекстов просмотра с документами с другого источника.

Этот заголовок работает вместе с Cross-Origin-Embedder-Policy (COEP) и Cross-Origin-Resource-Policy (CORP), объясненными ниже.

Этот механизм защищает от атак, таких как Spectre, которые могут пересечь границу безопасности, установленную Политикой одного источника (SOP) для ресурсов в одной группе контекста просмотра.

Так как эти заголовки тесно связаны с браузерами, их может не иметь смысла применять к REST API или клиентам, не являющимся браузерами.

Рекомендации

Изолируйте контекст просмотра исключительно для документов с того же источника.

Cross-Origin-Opener-Policy: same-origin

Cross-Origin-Embedder-Policy (COEP)

Заголовок HTTP-ответа Cross-Origin-Embedder-Policy (COEP) предотвращает загрузку документа любых ресурсов с другого источника, которые явно не предоставляют разрешение этому документу (с помощью CORP или CORS).

  • ПРИМЕЧАНИЕ: Включение этого заголовка заблокирует загрузку ресурсов с другого источника, если они не настроены должным образом.

Рекомендации

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

Cross-Origin-Embedder-Policy: require-corp

  • ПРИМЕЧАНИЕ: Вы можете обойти это для конкретных ресурсов, добавив атрибут crossorigin:
  • <img src="https://thirdparty.com/img.png" crossorigin>

Cross-Origin-Resource-Policy (CORP)

Заголовок Cross-Origin-Resource-Policy (CORP) позволяет контролировать набор источников, которые могут включать ресурс. Это надежная защита от атак, таких как Spectre, поскольку позволяет браузерам блокировать ответ до того, как он попадет в процесс злоумышленника.

Рекомендации

Ограничьте загрузку текущего ресурса только для сайта и его подсайтов.

Cross-Origin-Resource-Policy: same-site

Permissions-Policy (formerly Feature-Policy)

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

Более подробная информация: Permissions-Policy

Рекомендации

Установите этот заголовок и отключите все функции, которые вашему сайту не нужны, или разрешите их только авторизованным доменам:

Permissions-Policy: geolocation=(), camera=(), microphone=()

  • ПРИМЕЧАНИЕ: Этот пример отключает геолокацию, камеру и микрофон для всех доменов.

FLoC (Federated Learning of Cohorts)

FLoC — это метод, предложенный Google в 2021 году, для доставки интересных рекламных объявлений группам пользователей ("когортам"). Electronic Frontier Foundation, Mozilla, и другие считают, что FLoC не обеспечивает достаточную защиту конфиденциальности пользователей.

Рекомендации

Сайт может объявить, что не хочет включаться в список сайтов пользователя для расчета когорты, отправив этот HTTP-заголовок.

Permissions-Policy: interest-cohort=()

Server

Заголовок Server описывает программное обеспечение, используемое исходным сервером, который обработал запрос — то есть сервер, который сгенерировал ответ.

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

Рекомендации

Удалите этот заголовок или установите неинформативные значения.

Server: webserver

  • ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения технологии сервера.

X-Powered-By

Заголовок X-Powered-By описывает технологии, используемые веб-сервером. Эта информация раскрывает сервер злоумышленникам. Используя информацию в этом заголовке, злоумышленники могут легче находить уязвимости.

Рекомендации

Удалите все заголовки X-Powered-By.

  • ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения вашего технологического стека.

X-AspNet-Version

Предоставляет информацию о версии .NET.

Рекомендации

Отключите отправку этого заголовка. Добавьте следующую строку в ваш файл web.config в раздел <system.web> для его удаления.

<httpRuntime enableVersionHeader="false" />
  • ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения вашего технологического стека.

X-AspNetMvc-Version

Предоставляет информацию о версии .NET.

Рекомендации

Отключите отправку этого заголовка. Чтобы удалить заголовок X-AspNetMvc-Version, добавьте следующую строку в файл Global.asax.

MvcHandler.DisableMvcResponseHeader = true;
  • ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения вашего технологического стека.

X-DNS-Prefetch-Control

Заголовок X-DNS-Prefetch-Control HTTP-ответа управляет предзагрузкой DNS, функцией, при которой браузеры проактивно выполняют разрешение доменных имен как для ссылок, которые пользователь может выбрать для перехода, так и для URL-адресов элементов, упомянутых в документе, включая изображения, CSS, JavaScript и так далее.

Рекомендации

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

X-DNS-Prefetch-Control: off

  • ПРИМЕЧАНИЕ: Не полагайтесь на эту функциональность для защиты конфиденциальной информации в производственных системах: она не является стандартной и полностью поддерживаемой, и реализация может различаться между браузерами.

Public-Key-Pins (HPKP)

HTTP-заголовок Public-Key-Pins используется для связывания конкретного криптографического публичного ключа с определенным веб-сервером, чтобы уменьшить риск атак "человек посередине" с поддельными сертификатами.

Рекомендации

Этот заголовок устарел и больше не следует использовать.

Использование HTTP заголовков в иных технологиях.

PHP

Для установки заголовка X-Frame-Options в PHP используйте следующий код:

header("X-Frame-Options: DENY");

Apache

Для установки заголовка X-Frame-Options в Apache, добавьте следующий код в файл .htaccess. Обратите внимание, что без опции always заголовок будет отправляться только для некоторых кодов состояния, как указано в документации Apache.

<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
</IfModule>

IIS

Чтобы установить заголовок X-Frame-Options в IIS, добавьте следующую конфигурацию в файл Web.config:

<system.webServer>
...
 <httpProtocol>
   <customHeaders>
     <add name="X-Frame-Options" value="DENY" />
   </customHeaders>
 </httpProtocol>
...
</system.webServer>

HAProxy

Чтобы отправить заголовок X-Frame-Options в HAProxy, добавьте следующую строку в конфигурации вашего front-end, listen или backend:

http-response set-header X-Frame-Options DENY

Nginx

Ниже приведена примерная конфигурация, которая устанавливает заголовок X-Frame-Options в Nginx. Обратите внимание, что без опции always заголовок будет отправляться только для определенных кодов состояния, как описано в документации nginx.

add_header "X-Frame-Options" "DENY" always;

Express

Вы можете использовать helmet для настройки HTTP заголовков в Express. Приведенный ниже код является примером добавления заголовка X-Frame-Options.

const helmet = require('helmet');
const app = express();
// Устанавливает "X-Frame-Options: SAMEORIGIN"
app.use(
 helmet.frameguard({
   action: "sameorigin",
 })
);

Тестирование правильной реализации заголовков безопасности

Mozilla Observatory

Mozilla Observatory — это онлайн-инструмент, который помогает проверить статус заголовков на вашем сайте.

SmartScanner

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

Ссылки