HTTP-заголовки являются отличным инструментом для повышения веб-безопасности и легко внедряются. Правильные HTTP-заголовки ответа могут помочь предотвратить уязвимости, такие как межсайтовый скриптинг, кликовая подделка, раскрытие информации и другие.
В этой шпаргалке мы рассмотрим все заголовки HTTP, связанные с безопасностью, рекомендованные конфигурации и ссылки на другие источники для сложных заголовков.
Заголовок 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
Заголовок HTTP-ответа X-XSS-Protection
является функцией Internet Explorer, Chrome и Safari, которая останавливает загрузку страниц, когда обнаруживает атаки межсайтового скриптинга (XSS).
ПРЕДУПРЕЖДЕНИЕ: Хотя этот заголовок может защитить пользователей старых веб-браузеров, которые еще не поддерживают CSP, в некоторых случаях этот заголовок может создавать уязвимости XSS на в остальном безопасных веб-сайтах (источник).
Используйте Политику безопасности контента (CSP), которая отключает использование встроенного JavaScript.
Не устанавливайте этот заголовок или явно отключите его.
X-XSS-Protection: 0
Подробнее см. Mozilla X-XSS-Protection.
Заголовок HTTP-ответа X-Content-Type-Options
используется сервером для указания браузерам, что MIME-типы, указанные в заголовках Content-Type, должны соблюдаться, а не угадываться.
Этот заголовок используется для блокировки определения MIME-типа браузерами, которое может преобразовывать неисполняемые MIME-типы в исполняемые MIME-типы (Атаки путаницы MIME).
Установите заголовок Content-Type
правильно на всех страницах сайта.
X-Content-Type-Options: nosniff
Заголовок HTTP Referrer-Policy
контролирует, сколько информации о реферере (отправленной через заголовок Referer) должно включаться в запросы.
Политика реферера поддерживается браузерами с 2014 года. Сегодня стандартное поведение современных браузеров заключается в том, чтобы не отправлять всю информацию о реферере (происхождение, путь и строку запроса) на тот же сайт, а отправлять только происхождение на другие сайты. Однако, поскольку не все пользователи могут использовать последние версии браузеров, мы рекомендуем принудительно устанавливать это поведение, отправляя этот заголовок во всех ответах.
Referrer-Policy: strict-origin-when-cross-origin
- ПРИМЕЧАНИЕ: Для получения дополнительной информации о настройке этого заголовка см. Mozilla Referrer-Policy.
Заголовок Content-Type
используется для указания оригинального типа медиа-ресурса (до применения любого кодирования контента для отправки). Если он не установлен правильно, ресурс (например, изображение) может быть интерпретирован как HTML, что может создать уязвимости XSS.
Хотя рекомендуется всегда правильно устанавливать заголовок Content-Type
, это будет представлять собой уязвимость только в том случае, если контент предназначен для отображения клиентом, а ресурс является ненадежным (предоставлен или изменен пользователем).
Content-Type: text/html; charset=UTF-8
- ПРИМЕЧАНИЕ: Атрибут
charset
необходим для предотвращения XSS на HTML страницах. - ПРИМЕЧАНИЕ:
text/html
может быть любым из возможных MIME-типа.
Заголовок HTTP-ответа Set-Cookie
используется для отправки куки от сервера к пользовательскому агенту, чтобы пользовательский агент мог отправить его обратно на сервер позже. Для отправки нескольких куки следует отправить несколько заголовков Set-Cookie в одном ответе.
Это не является заголовком безопасности само по себе, но его атрибуты безопасности имеют решающее значение.
- Пожалуйста, ознакомьтесь со Шпаргалкой по управлению сессиями для детального объяснения вариантов конфигурации куки.
Заголовок 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
позволяет сайтам согласиться на отчетность о требованиях к прозрачности сертификатов (CT). Поскольку основные клиенты теперь требуют квалификации CT, единственное оставшееся значение — это отчетность о таких событиях на указанное значение report-uri в заголовке. Этот заголовок теперь меньше касается принудительного применения и больше касается обнаружения/отчетности.
Не используйте этот заголовок. Mozilla рекомендует избегать его и, если возможно, удалять из существующего кода.
Content Security Policy (CSP) — это функция безопасности, которая используется для указания источника контента, который разрешено загружать на веб-сайте или в веб-приложении. Это дополнительный уровень безопасности, который помогает обнаруживать и смягчать определенные типы атак, включая межсайтовое скриптование (XSS) и атаки на ввод данных. Эти атаки используются для кражи данных, порчи сайта и распространения вредоносного ПО.
- ПРИМЕЧАНИЕ: Этот заголовок актуален для страниц, которые могут загружать и интерпретировать скрипты и код, но может быть неуместен в ответах REST API, которые возвращают контент, не предназначенный для рендеринга.
Политика безопасности контента сложна для настройки и поддержания. Для объяснения вариантов настройки, пожалуйста, читайте Чек-лист Content Security Policy.
Если вы не используете этот заголовок, ваш сайт по умолчанию защищен Политикой одного источника (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, который должен быть доступен с любого источника, может потребоваться разрешение*
.
Заголовок 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
Заголовок 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) позволяет контролировать набор источников, которые могут включать ресурс. Это надежная защита от атак, таких как Spectre, поскольку позволяет браузерам блокировать ответ до того, как он попадет в процесс злоумышленника.
Ограничьте загрузку текущего ресурса только для сайта и его подсайтов.
Cross-Origin-Resource-Policy: same-site
Permissions-Policy позволяет контролировать, какие источники могут использовать какие функции браузера как на главной странице, так и в встроенных фреймах. Для каждой функции, управляемой Permissions-Policy, функция включается в текущем документе или фрейме только в том случае, если его источник соответствует разрешенному списку источников. Это означает, что вы можете настроить свой сайт так, чтобы никогда не разрешать активацию камеры или микрофона. Это предотвращает возможность того, что инъекция, например, XSS, активирует камеру, микрофон или другие функции браузера.
Более подробная информация: Permissions-Policy
Установите этот заголовок и отключите все функции, которые вашему сайту не нужны, или разрешите их только авторизованным доменам:
Permissions-Policy: geolocation=(), camera=(), microphone=()
- ПРИМЕЧАНИЕ: Этот пример отключает геолокацию, камеру и микрофон для всех доменов.
FLoC — это метод, предложенный Google в 2021 году, для доставки интересных рекламных объявлений группам пользователей ("когортам"). Electronic Frontier Foundation, Mozilla, и другие считают, что FLoC не обеспечивает достаточную защиту конфиденциальности пользователей.
Сайт может объявить, что не хочет включаться в список сайтов пользователя для расчета когорты, отправив этот HTTP-заголовок.
Permissions-Policy: interest-cohort=()
Заголовок Server
описывает программное обеспечение, используемое исходным сервером, который обработал запрос — то есть сервер, который сгенерировал ответ.
Это не является заголовком безопасности, но то, как он используется, имеет значение для безопасности.
Удалите этот заголовок или установите неинформативные значения.
Server: webserver
- ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения технологии сервера.
Заголовок X-Powered-By
описывает технологии, используемые веб-сервером. Эта информация раскрывает сервер злоумышленникам. Используя информацию в этом заголовке, злоумышленники могут легче находить уязвимости.
Удалите все заголовки X-Powered-By
.
- ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения вашего технологического стека.
Предоставляет информацию о версии .NET.
Отключите отправку этого заголовка. Добавьте следующую строку в ваш файл web.config
в раздел <system.web>
для его удаления.
<httpRuntime enableVersionHeader="false" />
- ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения вашего технологического стека.
Предоставляет информацию о версии .NET.
Отключите отправку этого заголовка. Чтобы удалить заголовок X-AspNetMvc-Version
, добавьте следующую строку в файл Global.asax
.
MvcHandler.DisableMvcResponseHeader = true;
- ПРИМЕЧАНИЕ: Помните, что злоумышленники имеют и другие способы определения вашего технологического стека.
Заголовок X-DNS-Prefetch-Control
HTTP-ответа управляет предзагрузкой DNS, функцией, при которой браузеры проактивно выполняют разрешение доменных имен как для ссылок, которые пользователь может выбрать для перехода, так и для URL-адресов элементов, упомянутых в документе, включая изображения, CSS, JavaScript и так далее.
Обычно браузеры выполняют кэширование DNS, что хорошо для большинства веб-сайтов. Если вы не контролируете ссылки на вашем сайте, вы можете установить значение off
, чтобы отключить предзагрузку DNS и избежать утечки информации на эти домены.
X-DNS-Prefetch-Control: off
- ПРИМЕЧАНИЕ: Не полагайтесь на эту функциональность для защиты конфиденциальной информации в производственных системах: она не является стандартной и полностью поддерживаемой, и реализация может различаться между браузерами.
HTTP-заголовок Public-Key-Pins
используется для связывания конкретного криптографического публичного ключа с определенным веб-сервером, чтобы уменьшить риск атак "человек посередине" с поддельными сертификатами.
Этот заголовок устарел и больше не следует использовать.
Для установки заголовка X-Frame-Options
в PHP используйте следующий код:
header("X-Frame-Options: DENY");
Для установки заголовка X-Frame-Options
в Apache, добавьте следующий код в файл .htaccess
. Обратите внимание, что без опции always
заголовок будет отправляться только для некоторых кодов состояния, как указано в документации Apache.
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
</IfModule>
Чтобы установить заголовок X-Frame-Options
в IIS, добавьте следующую конфигурацию в файл Web.config
:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="DENY" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
Чтобы отправить заголовок X-Frame-Options
в HAProxy, добавьте следующую строку в конфигурации вашего front-end, listen или backend:
http-response set-header X-Frame-Options DENY
Ниже приведена примерная конфигурация, которая устанавливает заголовок X-Frame-Options
в Nginx. Обратите внимание, что без опции always
заголовок будет отправляться только для определенных кодов состояния, как описано в документации nginx.
add_header "X-Frame-Options" "DENY" always;
Вы можете использовать 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 — это онлайн-инструмент, который помогает проверить статус заголовков на вашем сайте.
SmartScanner имеет специализированный профиль тестирования для проверки безопасности HTTP заголовков. Онлайн-инструменты обычно тестируют домашнюю страницу указанного адреса. Но SmartScanner сканирует весь сайт. Так что вы можете убедиться, что все ваши веб-страницы имеют правильные HTTP заголовки.
- Mozilla: X-Frame-Options
- Mozilla: X-XSS-Protection
- hstspreload.org
- Mozilla: Strict-Transport-Security
- Mozilla: Content-Type
- Mozilla: Expect-CT
- Mozilla: Set-Cookie
- content-security-policy.com
- Mozilla: Cross-Origin-Opener-Policy
- resourcepolicy.fyi
- Mozilla: Cross-Origin-Resource-Policy
- Mozilla: Cross-Origin-Embedder-Policy
- Mozilla: Server Header
- Связанный проект OWASP: Проект Secure Headers