Перейти до вмісту
SEOAudit
← Назад до блогу
Безпека та SEO

Заголовки безпеки сайту: 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 поетапно:

  1. Увімкніть Content-Security-Policy-Report-Only. Браузер лише повідомлятиме про порушення, нічого не блокуючи.
  2. Подивіться в консолі браузера або у звітах, які ресурси порушують політику.
  3. Додайте законні джерела, приберіть непотрібні.
  4. Перемкніть заголовок на 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Тримає браузер на HTTPSmax-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.

  • Технічне SEO

    8 хв читання

    Що перевіряти в SEO-аудиті сайту: чекліст технічного SEO

    Технічний SEO-аудит зручніше проходити за порядком: чи сторінку можна просканувати, проіндексувати, зрозуміти, чи вона достатньо швидка і безпечна. Нижче чекліст з поясненнями і пріоритетами.

    Читати статтю

  • Технічне SEO

    8 хв читання

    Як налаштувати robots.txt: синтаксис, приклади та типові помилки

    Файл robots.txt керує скануванням, а не індексацією, і саме на цьому плутанні сайти втрачають сторінки. Розбираємо синтаксис, правила збігу, приклади, перевірку та типові помилки запуску.

    Читати статтю

  • Технічне SEO

    7 хв читання

    Sitemap.xml: що додавати, типові помилки та як перевірити файл

    Sitemap підказує пошуковим системам, які адреси варто знайти. Файл простий, доки в ньому не опиняються редиректи, сторінки з noindex або чужий хост. Розбираємо вимоги, помилки та перевірку.

    Читати статтю

Потрібен аудит безпеки?

Наші експерти готові допомогти. Вебаудит, інфраструктура, відповідність NIS2...