Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy и Strict-Transport-Security — шесть служебных строк, которые сервер передаёт браузеру вместе со страницей. Они говорят, какие ресурсы странице разрешено загружать, можно ли показывать её в чужой рамке, как обходиться с типом файла и по какому протоколу обращаться к сайту. Это не «защита сайта» целиком, а несколько отдельных линий обороны — и «Content-Security-Policy отсутствует» в отчёте не значит, что сайт взломали.
Что вообще такое заголовок ответа — в переводе на бизнес
Когда браузер открывает страницу, сервер отвечает не только её текстом. Вместе с ним приходит набор служебных строк — заголовков ответа: тип содержимого, дата, кодировка, правила кэширования. Браузер их читает и подчиняется. Заголовки безопасности — та часть, которая говорит браузеру «этого не делай»: не загружай скрипт с чужого домена, не показывай страницу в чужой рамке.
Заголовок ничего не делает на сервере: это инструкция, которую сервер передаёт, а исполняет её браузер посетителя. Поэтому «поставить заголовок» — не «включить защиту», а «передать браузеру правило». Проект OWASP Secure Headers описывает такие заголовки как способ повысить безопасность приложения.
CSP: какие ресурсы странице разрешено загружать
Content-Security-Policy (политика безопасности содержимого) — заголовок, которым сайт говорит браузеру, какие ресурсы странице разрешено загружать. По описанию MDN он позволяет администратору сайта управлять тем, что браузеру можно подгружать для конкретной страницы, и помогает защищаться от атак типа cross-site scripting, XSS — межсайтового скриптинга, когда на страницу попадает чужой код и выполняется от её имени.
Работает это как список разрешений. Директива default-src — резервная для всех остальных директив загрузки. Директива frame-ancestors задаёт, какие родительские страницы могут встраивать вашу, — это замена X-Frame-Options внутри CSP. Отдельная история — unsafe-inline и nonce: первый разрешает скрипты, вписанные прямо в разметку, второй — одноразовая метка для конкретного скрипта; если есть оба, браузер игнорирует unsafe-inline.
По нашему замеру CSP не было у 871 из 955 сайтов, отдавших главную страницу, — 91,2 %. Самый массовый пробел из всех, что мы видели.
X-Frame-Options: можно ли встроить вашу страницу в чужую
X-Frame-Options (параметры фрейма) отвечает на один вопрос: можно ли показывать вашу страницу внутри чужого frame или iframe. По MDN заголовок указывает, разрешено ли браузеру отображать документ в frame, iframe, embed или object. Нужен он против кликджекинга — перехвата клика, когда чужой сайт кладёт вашу страницу к себе невидимым слоем, и посетитель думает, что нажимает кнопку у вас, а нажимает у него.
Если заголовка нет и нет другого механизма ограничения встраивания — например, директивы frame-ancestors в CSP, — браузер разрешит другим сайтам встроить документ. Это не авария и не взлом: просто по умолчанию встраивание не запрещено.
RFC 7034 вышел в октябре 2013 года со статусом Informational — это описание практики, а не обязательный стандарт. Значений у заголовка три, и они взаимоисключающие. Для владельца сайта важны два:
- DENY — браузер не должен показывать контент ни в одном фрейме.
- SAMEORIGIN — браузер не должен показывать контент во фрейме страницы с другим origin, то есть с другого источника.
По нашему замеру X-Frame-Options отсутствовал у 12 из 955 сайтов — 1,3 %. Считали строго: отсутствующим признавался только случай, когда не было и frame-ancestors в CSP.
X-Content-Type-Options: не угадывать тип файла
X-Content-Type-Options (параметры типа содержимого) — короткий заголовок с одним рабочим значением nosniff. Он сообщает, что типы, объявленные в Content-Type, нужно соблюдать и не менять: sniff — определять тип по содержимому, nosniff это выключает. MDN приводит пример: при Content-Type: text/plain и X-Content-Type-Options: nosniff браузер не будет трактовать ответ как HTML, даже если внутри есть разметка.
MDN добавляет: специалисты по тестированию безопасности обычно ожидают, что этот заголовок установлен. У 27 из 955 сайтов — 2,8 % — заголовка не было или он не был равен nosniff: в цифру попали и те, где строки нет, и те, где значение другое.
Referrer-Policy и Permissions-Policy: два заголовка, о которых забывают
Эти два заголовка в отчётах встречаются реже остальных — и именно поэтому их легко пропустить. Referrer-Policy (политика реферера) управляет тем, сколько информации о переходе уходит вместе с запросами. Реферер — адрес страницы, с которой посетитель пришёл. По MDN значение по умолчанию — strict-origin-when-cross-origin: если заголовка нет, умолчание у браузера всё равно есть, просто сайт его не выбирал.
Permissions-Policy (политика разрешений) — механизм разрешать и запрещать использование возможностей браузера в документе или внутри любого iframe на странице. Речь о том, что сайт запрашивает у посетителя: камера, микрофон, геолокация.
Наши цифры: Referrer-Policy не было у 24 из 955 — 2,5 %, Permissions-Policy — у 4 из 955, 0,4 %. Второй показатель мал, но вывод «его ставят все» неверен: у остальных строка присутствует — а не обязательно что-то запрещает.
HSTS: только HTTPS, и точка
Strict-Transport-Security (строгая транспортная безопасность, HSTS) сообщает браузеру, что к хосту нужно обращаться только по HTTPS, а будущие попытки по HTTP автоматически переводятся на HTTPS. Главный параметр — max-age: время в секундах, которое браузер помнит, что к хосту можно обращаться только по HTTPS. Пока срок не истёк, браузер сам переводит адрес на HTTPS, даже если посетитель набрал http://.
С preload связана отдельная история, вокруг которой больше всего путаницы: для него max-age должен быть не меньше 31536000 (год в секундах) и обязательна директива includeSubDomains. Оба требования относятся именно к preload — универсального правила «минимум год для всех» в наших источниках нет.
Подробнее HSTS разобран в статье про предупреждение браузера о небезопасном соединении. В таблице ниже HSTS нет: отдельной метрикой в этом замере мы его не считали.
Почему CSP нет у 91 %, а X-Frame-Options есть почти у всех
Замер — 1 000 интернет-магазинов малого и среднего бизнеса, 15 октября 2026 года, только по открытым ответам серверов. Главную страницу отдали 955 сайтов — это знаменатель во всех строках. По состоянию на ноябрь 2026 года картина такая.
| Заголовок | Что делает | Нет у магазинов (из 955) |
|---|---|---|
| Content-Security-Policy | задаёт, какие ресурсы странице разрешено загружать | 871 — 91,2 % |
| X-Frame-Options | решает, можно ли встроить страницу в чужую | 12 — 1,3 % |
| X-Content-Type-Options | запрещает браузеру угадывать тип файла | 27 — 2,8 % |
| Referrer-Policy | управляет тем, сколько данных о переходе уходит с запросами | 24 — 2,5 % |
| Permissions-Policy | разрешает и запрещает возможности браузера | 4 — 0,4 % |
Оговорка к таблице. По X-Content-Type-Options в счёт попали и сайты, где заголовка нет, и те, где он есть, но не равен nosniff. По X-Frame-Options — только те, где нет ни заголовка, ни frame-ancestors в CSP. Определения разные, складывать строки нельзя.
Разрыв между первой строкой и остальными — главное, что стоит увидеть. Хотя бы одна находка по заголовкам есть у 952 из 955 сайтов (99,7 %): почти у каждого магазина чего-то не хватает, но у большинства не хватает именно CSP. Срез по движкам подтверждает: на популярном конструкторе CSP не было у 110 из 110 сайтов, на готовом движке для интернет-торговли — у 91 из 95, на тяжёлой коробочной CMS — у 291 из 343.
Почему так? Вероятная причина — разная цена настройки. X-Frame-Options часто приходит вместе с движком или шаблоном: он простой и не зависит от того, какие скрипты вы подключили. CSP требует индивидуальной работы под конкретный сайт. Объяснение правдоподобное, но в наших источниках его нет — считайте его гипотезой.
Что это значит для вас и что делать
Порядок простой, и технических знаний он не требует — только понимания, кому ставить задачу.
- Посмотрите, что отдаёт ваш сайт. Не инструкцию к движку, а реальный ответ на главную страницу.
- Начните с CSP. Это самый массовый пробел.
- Потом cookie-флаги. Отдельная проверка того же замера: у 661 из 955 сайтов (69,2 %) хотя бы одна cookie отдавалась без флага Secure.
- Дальше — остальное. X-Content-Type-Options, Referrer-Policy, Permissions-Policy, HSTS. По отдельности мелочь, вместе — общая гигиена.
- Поставьте задачу тому, кто отвечает за сервер или шаблон. Администратор, подрядчик или поддержка хостинга.
Готовых конфигов мы не даём сознательно: синтаксис зависит от сервера, панели и шаблона, а непроверенный блок может уронить сайт.
Проверить, что приходит в ответе вашего сайта, можно на странице бесплатного осмотра: проверка заголовков ответа входит в бесплатный осмотр стражсайта.рф. Осмотр пассивный — команда стражсайта.рф читает ответ сайта, ничего не ломает, не подбирает пароли и не пытается ничего эксплуатировать.
Чего наша проверка не доказывает
Отчёт — это снимок, а не приговор. Вот чего наша проверка не делает.
- Не подтверждает уязвимость. Отсутствие заголовка — не «дыра» и не признак того, что сайт взломали.
- Не измеряет, сколько атак предотвращено. Ни MDN, ни RFC 7034 таких цифр не дают — и мы не даём.
- Не гарантирует, что заголовки идут от вашего сервера. Если главная отдаётся через CDN или WAF, строки в ответе могут быть не от origin — тогда проверка помечается как degraded, а не «нет заголовков».
- Не описывает рынок за пределами выборки. 91,2 % — это 871 из 955 доменов нашей выборки магазинов, а не «весь рунет».
- Смотрит только главную страницу. Остальные страницы сайта в этот замер не входили.
Как устроены проверки и в каком порядке они идут, описано в разделе методика.
Короткие ответы на частые вопросы
Отсутствие заголовков — это взлом?
Нет. Заголовок — одна из линий защиты, а не признак компрометации. Наш замер показывает, что CSP нет у 871 из 955 магазинов, — это распространённая гигиеническая проблема, а не свидетельство того, что сайт уже взломали.
Какой заголовок важнее остальных?
Однозначного приоритета источники не дают. По нашей выборке самый массовый пробел — CSP, а X-Frame-Options отсутствует у единиц. Начинать логично с того, чего нет у вас.
Если поставить CSP, сайт станет неуязвимым?
Нет. CSP ограничивает источники загрузки и, по описанию MDN, помогает защищаться от атак типа cross-site scripting. Но он не заменяет остальные меры, и ни MDN, ни RFC 7034 не утверждают, что одного заголовка достаточно.
Можно ли поставить заголовки в панели хостинга?
В наших источниках этого нет: MDN и RFC описывают сам заголовок, а не способы его настройки у конкретных провайдеров. Этот вопрос решает тот, кто отвечает за сервер или шаблон сайта.
Заголовки безопасности — это несколько конкретных правил, которые сервер передаёт браузеру, а не общая «защита сайта». Их отсутствие не означает взлома, но означает, что одна из линий защиты не работает. Самая массовая нехватка — CSP: его нет у 871 из 955 магазинов. Начните с неё — и с того, чтобы узнать, что отдаёт именно ваш сайт.