Руководства по безопасности
Как выбрать заголовки безопасности: что ещё нужно, что устарело и что вредит
Многие списки заголовков безопасности давно не обновлялись и советуют уже ненужные заголовки. MDN помечает X-XSS-Protection как устаревший и нестандартный и предупреждает, что он может создавать XSS-уязвимости на безопасных сайтах. Какие заголовки ставить сегодня, а какие убрать.
Примеров настройки заголовков полно. Проблема в том, что большинство из них перестали обновлять. Скопировав список, который был верен несколько лет назад, вы получите заголовки, которые уже не нужны, — и один, который может навредить.
① Шесть, которые стоит ставить сегодня
Наш сканер заголовков безопасности оценивает именно по этим шести. Устаревшие заголовки намеренно исключены.
- Content-Security-Policy
- Объявляет, откуда можно загружать скрипты и ресурсы. Главная мера, которая сужает возможности XSS. Его директива
frame-ancestorsтакже управляет встраиванием - Strict-Transport-Security
- Говорит браузеру всегда возвращаться по HTTPS и закрывает первый незашифрованный запрос (
max-ageплюсincludeSubDomains) - X-Frame-Options
- Запрещает встраивание во фреймы на других сайтах — защита от кликджекинга. На практике ставится вместе с
frame-ancestorsиз CSP - X-Content-Type-Options
nosniff. Не даёт браузеру угадывать тип по содержимому, что уменьшает случаи, когда загруженный файл интерпретируется не так, как должен- Referrer-Policy
- Ограничивает передаваемый дальше referrer и уменьшает утечку того, что оказалось в URL (исходя из того, что секретов в URL вы и так не кладёте)
- Permissions-Policy
- Отключает возможности браузера по умолчанию — камеру, микрофон, геолокацию. Закройте то, чем не пользуетесь
Порядок важен: начните с того, что ничего не сломает
X-Content-Type-Options, X-Frame-Options, Referrer-Policy и Permissions-Policy надёжны и вряд ли нарушат отображение, поэтому их можно добавить первыми. Strict-Transport-Security стоит отложить, пока HTTPS не заработает на всех путях: браузеры его запоминают, и откатить его трудно.
CSP — последним и постепенно. Он затрагивает больше всего функций, и если сразу сделать его строгим, нужные функции сломаются. Собирайте его в конструкторе CSP.
② Что уже не нужно
Expect-CT: в основном устарел с июня 2021 года
MDN помечает этот заголовок как Deprecated и поясняет, что его реализовали только Google Chrome и другие браузеры на Chromium, а Chromium отказался от заголовка начиная с версии 107, потому что теперь применяет CT по умолчанию. Примечание на той же странице добавляет, что Expect-CT в основном устарел с июня 2021 года.
Иначе говоря, браузер стал делать это по умолчанию, и сайту больше нечего ему указывать. Добавлять его во что-то новое незачем.
③ Что теперь может навредить
X-XSS-Protection: устаревший, нестандартный и способный создать XSS
На странице MDN об этом заголовке стоят сразу две пометки — Deprecated и Non-standard, а также предупреждение: хотя эта функция может защитить пользователей старых браузеров без поддержки CSP, в некоторых случаях X-XSS-Protection может создавать XSS-уязвимости на сайтах, которые иначе были бы безопасны.
Рекомендация однозначна: вместо XSS-фильтрации рекомендуется использовать Content-Security-Policy.
Это решающий довод против принципа «чем больше заголовков, тем лучше». Настройка, добавленная из лучших побуждений, при определённых условиях сама становится точкой атаки. Если вы его не отправляете, не добавляйте; если отправляете, запланируйте удаление. О самой уязвимости — в статье что такое XSS.
Как выглядит устаревший список
CSP, HSTS, X-Frame-Options и nosniff — плюс
X-XSS-Protection: 1; mode=block
Expect-CT: max-age=…
Public-Key-Pins: …
Список длиннее, и некоторые сканеры могут даже оценить его выше. Но в современных браузерах эти лишние строки либо ничего не делают, либо могут навредить.
Как выглядит практика сейчас
CSP в центре, остальные пять его дополняют.
Устаревшие заголовки не добавляются, а где есть — удаляются. Усилия, вложенные в качество CSP — а именно в то, сколько 'unsafe-inline' вы убрали, — дают гораздо больше реальной защиты, чем удлинение списка.
Исходное условие: заголовки не исправляют саму уязвимость
Дефекты приложения (XSS, отсутствие проверки прав, загрузка файлов)
никакое число заголовков их не устраняет
↓ когда такой дефект срабатывает
Чем управляют заголовки
куда можно отправлять данные · можно ли встроить страницу во фрейм · разрешён ли незашифрованный канал = ограничение распространения
CSP на сайте с XSS-уязвимостью не убирает XSS, а сужает то, что с ней можно сделать. Поэтому порядок такой: исправить дефект приложения, затем добавить заголовки как ещё один уровень. Верно и обратное: идеальная оценка заголовков не доказывает, что сайт безопасен.
Проверка своего сайта
Измерьте, что на самом деле возвращается
Смотрите на ответы, а не на файлы настроек. Обратные прокси, CDN, фреймворки и само приложение добавляют или перезаписывают заголовки, поэтому настроенное и отправляемое не всегда совпадают. Наш сканер заголовков проверяет URL напрямую.
Ищите в ответе устаревшие заголовки
Если возвращаются X-XSS-Protection или Expect-CT, запланируйте их удаление. Особенно первый — как сказано выше, в документации отмечено, что он может создать уязвимость.
Добавьте четыре заголовка, которые ничего не сломают
X-Content-Type-Options: nosniff, X-Frame-Options: DENY, Referrer-Policy: strict-origin-when-cross-origin и Permissions-Policy, закрывающий неиспользуемые возможности. Надёжно и вряд ли повлияет на отображение.
Отложите HSTS, пока HTTPS не заработает полностью
Strict-Transport-Security запоминается браузером, поэтому если включить его, пока HTTPS работает нестабильно, восстановление будет болезненным. Сначала убедитесь, что все пути отдаются по HTTPS. Основы сертификатов — в статье что такое Let's Encrypt.
Вводите CSP постепенно и ужесточайте
Начните с мягкой политики и ужесточайте её с целью убрать 'unsafe-inline' — от того, насколько это удастся, во многом зависит, сколько защиты даёт CSP. Собирайте его в конструкторе CSP и заодно пройдитесь по остальным пунктам чек-листа базовой безопасности.
Взгляд этого сайта: в скопированной настройке безопасность зависит от возраста источника
Заголовки безопасности — типичная настройка, которую копируют, поэтому от возраста источника зависит, насколько безопасен результат. Оба заголовка из этой статьи когда-то были правильными. С X-XSS-Protection всё зашло дальше: рекомендация своего времени стала сегодняшним предупреждением.
Наша позиция: относиться к настройке заголовков как к настройке, которую время от времени пересматривают, а не к задаче, которую выполняют один раз, — и не гнаться за оценкой сканера, ведь оценка может вырасти от добавления устаревшего заголовка. Тратьте время на качество CSP, а не на длину списка.
Источники (первичные)
- MDN Web Docs, «X-XSS-Protection» — developer.mozilla.org (пометки Deprecated и Non-standard, предупреждение о том, что заголовок может создавать XSS-уязвимости на безопасных сайтах, и рекомендация использовать CSP)
- MDN Web Docs, «Expect-CT» — developer.mozilla.org (пометка Deprecated, отказ в Chromium 107 и его причина, примечание о том, что заголовок в основном устарел с июня 2021 года)
Оба источника проверены 5 сентября 2026 года.
Что прочитать дальше
- Инструменты: сканер заголовков безопасности / конструктор CSP
- Глоссарий: что такое XSS / что такое кликджекинг / что такое CORS
- Основы: чек-лист базовой безопасности
FAQ
QНужно ли ставить X-XSS-Protection?
Нет. MDN помечает этот заголовок как Deprecated (устаревший) и Non-standard (нестандартный) и предупреждает: хотя он может защитить пользователей старых браузеров без поддержки CSP, в некоторых случаях X-XSS-Protection может создавать XSS-уязвимости на сайтах, которые иначе были бы безопасны. Рекомендация однозначна: использовать Content-Security-Policy вместо XSS-фильтрации. Если вы его не отправляете, не добавляйте; если отправляете, запланируйте удаление.
QНужен ли ещё Expect-CT?
Нет. MDN помечает его как Deprecated и поясняет, что его реализовали только Google Chrome и другие браузеры на Chromium, а Chromium отказался от заголовка начиная с версии 107, потому что теперь применяет Certificate Transparency по умолчанию. В примечании на той же странице сказано, что заголовок в основном устарел с июня 2021 года. Добавлять его во что-то новое незачем.
QТак какие же ставить?
Практичная отправная точка — шесть заголовков, по которым оценивает наш инструмент проверки: Content-Security-Policy, Strict-Transport-Security, X-Frame-Options, X-Content-Type-Options, Referrer-Policy и Permissions-Policy. Устаревшие заголовки в этот набор намеренно не входят. По порядку: сначала добавьте надёжные и вряд ли что-то ломающие (nosniff, X-Frame-Options), а CSP вводите постепенно, потому что он затрагивает больше всего функций.
QЕсли поставить все заголовки, сайт будет защищён?
Нет. Заголовки не исправляют уязвимости в приложении — они ограничивают, насколько далеко распространится ущерб. CSP на сайте с XSS-уязвимостью не убирает XSS, а сужает то, что с ней можно сделать. Сначала исправьте дефект приложения, а заголовки добавьте как ещё один уровень защиты. И наоборот: идеальная оценка сканера заголовков не доказывает, что сайт безопасен.