Заголовки безпеки сайту: HSTS, CSP, nosniff і як їх перевірити
SEOAudit7 хв читання
Заголовки безпеки сайту — це HTTP-заголовки відповіді, якими сервер дає браузеру правила: лише HTTPS, дозволені джерела скриптів, заборона вгадувати тип файлу. Для SEO вони не є фактором ранжування, і жодне джерело цього не стверджує. Але зв'язок із пошуковою присутністю все ж є, і він непрямий.
Нижче розберемо, де цей зв'язок реальний, а де його вигадують. Для кожного заголовка наведемо приклад значення, покажемо, як налаштувати його на сервері та як перевірити результат. Безпечну частину цієї перевірки виконує перевірка безпеки сайту, а SEO-частину доповнює технічний SEO-чекліст.
Як заголовки безпеки пов'язані з пошуком
Почнемо з головного застереження: додавання заголовків безпеки саме по собі не піднімає сторінки у видачі. Не варто обіцяти це ні собі, ні клієнтові.
Реальні зв'язки такі:
- HTTPS. Google у документації радить віддавати сторінки через HTTPS. Заголовок HSTS допомагає тримати відвідувача саме на HTTPS.
- Відображення сторінки. Неправильна політика CSP може заблокувати скрипти, стилі чи вбудовані елементи, потрібні сторінці. Тоді вона виглядає інакше, ніж ви очікуєте, у тому числі для інструментів, які її рендерять.
- Типи файлів. Заголовок nosniff змушує браузер поважати оголошений MIME-тип. Скрипт чи стиль із хибним типом буде заблоковано.
- Керування індексацією. Заголовок
X-Robots-Tagсам є SEO-заголовком: через нього передають правила індексації в HTTP. - Зламаний сайт. Вставлений спам, перенаправлення на сторонні адреси чи попередження про шкідливе ПЗ шкодять присутності сайту в пошуку. Гігієна безпеки (CSP, прапорці cookie, оновлення) зменшує ризик такого сценарію, але не усуває його.
Тож правильна рамка така: заголовки безпеки не прискорюють ріст, вони прибирають ризики, які можуть його зупинити. Детальніше про сусідні технічні теми читайте в статтях про robots.txt і canonical.
HSTS: тримати відвідувачів на HTTPS
Заголовок Strict-Transport-Security (HSTS, описаний у RFC 6797) повідомляє браузеру: цей сайт слід відкривати лише через HTTPS протягом вказаного часу. Типове значення:
Strict-Transport-Security: max-age=31536000; includeSubDomainsЧисло в max-age задає секунди, тут один рік. Кілька практичних правил:
- Браузер враховує HSTS лише у відповідях, отриманих по HTTPS. На HTTP заголовок ігнорується.
- Після першого візиту браузер сам переходить на HTTPS, без запиту на HTTP і редиректу. Для повторних відвідувачів це економить один обмін із сервером.
- Починайте з короткого
max-age, наприкладmax-age=300. Якщо після кількох днів нічого не зламалося, збільшуйте значення. includeSubDomainsпоширює правило на всі піддомени. Спершу переконайтеся, що кожен піддомен справді працює по HTTPS.- Токен
preloadразом ізincludeSubDomainsіmax-ageне менше року дозволяє подати домен до списку hstspreload.org. Вилучитися зі списку складно, тому робіть це в останню чергу.
Опис заголовка є в документації MDN. HSTS не замінює редирект з HTTP на HTTPS: перший візит без нього лишається незахищеним.
Content-Security-Policy: що дозволено завантажувати
Заголовок Content-Security-Policy (CSP) перелічує, звідки сторінка може брати скрипти, стилі, зображення, фрейми. Це основний захист від впровадження чужого коду. Базовий приклад політики:
Content-Security-Policy: default-src 'self'; img-src 'self' data:; script-src 'self'; frame-ancestors 'self'З погляду SEO головний ризик у тому, що надто сувора політика ламає сторінку. Аналітика, менеджер тегів, віджет чату, шрифти зі сторонніх доменів: усе це треба явно дозволити, інакше ресурс не завантажиться.
Тому впроваджуйте CSP поетапно:
- Увімкніть
Content-Security-Policy-Report-Only. Браузер лише повідомлятиме про порушення, нічого не блокуючи. - Подивіться в консолі браузера або у звітах, які ресурси порушують політику.
- Додайте законні джерела, приберіть непотрібні.
- Перемкніть заголовок на
Content-Security-Policy.
Уникайте 'unsafe-inline' у script-src без nonce чи хеша: така політика майже не захищає. Блоки JSON-LD є даними, а не виконуваними скриптами, тому зазвичай nonce їм не потрібен. Докладно про синтаксис: MDN про CSP. Про розмітку читайте в посібнику з JSON-LD.
nosniff, Referrer-Policy, Permissions-Policy і захист від фреймів
Решта заголовків простіші, але кожен закриває свій ризик.
X-Content-Type-Options
Єдине значення: X-Content-Type-Options: nosniff. Браузер перестає вгадувати тип файлу за вмістом і довіряє заголовку Content-Type. Якщо скрипт чи стиль віддано з неправильним типом, його буде заблоковано. Тож перед увімкненням перевірте, що сервер віддає правильні типи для .js і .css. Опис: MDN.
Referrer-Policy
Керує тим, скільки адреси передається у заголовку Referer при переході на інший сайт. Сучасні браузери за замовчуванням застосовують strict-origin-when-cross-origin: на інші домени йде лише початок адреси. Явне значення робить поведінку передбачуваною. Враховуйте, що в аналітиці суворіша політика може сховати частину даних про джерела переходів. Докладніше: MDN про Referrer-Policy.
Permissions-Policy
Вимикає браузерні можливості, які сайту не потрібні, наприклад Permissions-Policy: camera=(), microphone=(), geolocation=(). Опис: MDN.
Захист від вбудовування у фрейми
Щоб інший сайт не показав вашу сторінку у прихованому фреймі, використовуйте директиву frame-ancestors в CSP. Застарілий X-Frame-Options: SAMEORIGIN ще підтримується й підходить як додатковий варіант.
X-Robots-Tag: заголовок, що справді стосується індексації
Серед HTTP-заголовків є один, який напряму впливає на пошук: X-Robots-Tag. Він працює як мета-тег robots, але передається в HTTP, тому підходить для файлів без HTML, наприклад PDF. Приклад:
X-Robots-Tag: noindex, nofollowЧому про нього варто знати в контексті безпеки. Налаштування сервера чи CDN інколи додають цей заголовок усій зоні, наприклад на тестовому домені, а потім він випадково потрапляє у продакшен. Сторінка при цьому виглядає нормально, у коді немає жодного noindex, а з індексу вона зникає. Описано в документації Google про robots meta і X-Robots-Tag.
Сканер об'єднує директиви з meta robots, googlebot, bingbot і X-Robots-Tag: перемагає найсуворіша, а розбіжність між заголовком і мета-тегом потрапляє до звіту. Якщо ви керуєте доступом через файл, а не заголовок, див. посібник з robots.txt.
Як налаштувати заголовки на сервері
Заголовки задають на веб-сервері, на CDN або в коді застосунку. Приклад для nginx у блоці server з HTTPS:
add_header Strict-Transport-Security "max-age=300" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header Content-Security-Policy-Report-Only "default-src 'self'" always;Параметр always потрібен, щоб заголовок додавався і до відповідей з кодами помилок, а не лише до успішних. Якщо ви задаєте add_header у вкладеному блоці location, заголовки з батьківського рівня туди не успадковуються, тож повторіть їх.
Після змін відповідь сервера має виглядати приблизно так:
HTTP/2 200
content-type: text/html; charset=utf-8
strict-transport-security: max-age=300
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin
permissions-policy: camera=(), microphone=(), geolocation=()
content-security-policy-report-only: default-src 'self'На CDN заголовки зазвичай додають правилами трансформації відповідей, у застосунках на Node чи PHP — через проміжний шар. Який би спосіб ви не обрали, перевіряйте результат на живій адресі, а не лише в конфігурації.
Як перевірити заголовки і що покаже сканер
Найпростіший спосіб: командний рядок:
curl -sI https://example.comПрапорець -I запитує лише заголовки. Також їх видно у вкладці Network інструментів розробника браузера. Перевіряйте не тільки головну сторінку, а й типові шаблони та сторінки помилок.
Підсумок по заголовках:
| Заголовок | Що робить | Типове значення | Що шукає сканер |
|---|---|---|---|
| Strict-Transport-Security | Тримає браузер на HTTPS | max-age=31536000; includeSubDomains | відсутній, слабкий, без піддоменів |
| Content-Security-Policy | Обмежує джерела ресурсів | default-src 'self' | відсутній, лише report-only, слабкий |
| X-Content-Type-Options | Забороняє вгадувати MIME-тип | nosniff | відсутній |
| Referrer-Policy | Обмежує передачу адреси | strict-origin-when-cross-origin | відсутній або небезпечний |
| Permissions-Policy | Вимикає зайві можливості | camera=(), microphone=() | відсутній |
| Захист від фреймів | Забороняє вбудовування | frame-ancestors 'self' | відсутній або слабкий |
Сканер SEOAudit читає ці заголовки в звичайній відповіді. Відсутні HSTS, CSP і захист від фреймів він оцінює як важливі, відсутній nosniff як інформаційний. Також він показує відсутність HTTPS, редиректу з HTTP, змішаний вміст, проблеми сертифіката, прапорці cookie та заголовки, що розкривають версії сервера. Для HSTS перевірка стосується лише HTTPS-відповідей на доменних іменах, не на IP-адресах; frame-ancestors береться лише з заголовка.
Важливо: сканер пасивний. Він лише читає заголовки і не пробує жодних експлойтів, а тому не доводить, що сайт безпечний. Це список спостережень, а не сертифікат. Результат SEO-частини того самого скану дивіться на сторінці SEO-аудиту, а питання видимості для ШІ-пошуку — у розділі про ШІ-видимість.
Заголовки безпеки не підніматимуть сторінки у видачі, але вони тримають відвідувачів на HTTPS, захищають від чужого коду і зменшують ризик зламу, який справді шкодить присутності в пошуку. Впроваджуйте їх поступово й перевіряйте на живому сайті. Почати можна з безкоштовного скану, який покаже, яких заголовків бракує.
Часті запитання
- Чи впливають заголовки безпеки на позиції в Google?
Жодне документоване джерело не називає заголовки безпеки фактором ранжування, тому обіцяти зростання позицій не слід. Вони впливають опосередковано: тримають користувачів на HTTPS, допомагають уникнути зламу та змішаного вмісту, а помилкова політика CSP може зламати відображення сторінки. Розглядайте їх як гігієну, а не як спосіб просування.
- З чого почати: HSTS чи CSP?
Зазвичай із HTTPS і редиректу з HTTP, потім додають HSTS із коротким
max-age. CSP складніший, тому його вводять черезContent-Security-Policy-Report-Onlyі лише потім переводять у бойовий режим. Заголовкиnosniffі Referrer-Policy додаються найпростіше, їх можна ввімкнути одразу після перевірки MIME-типів.- Чи можна зламати сайт неправильним CSP?
Так, надто сувора політика блокує скрипти, стилі, шрифти чи вбудовані елементи, і сторінка працюватиме неправильно. Тому спершу використовуйте режим report-only, перевірте консоль браузера й лише потім вмикайте блокування. Після кожної зміни перегляньте ключові шаблони сайту, зокрема форми та сторінки з аналітикою.
- Чи потрібне HSTS preload?
Не обов'язково. Preload вносить домен до списку, вбудованого в браузери, і діє навіть на першому візиті, проте вимагає
max-ageне менше року,includeSubDomainsі токенаpreload, а відкотити його складно. Вмикайте його лише тоді, коли всі піддомени стабільно працюють по HTTPS.