Заголовки безопасности — HTTP-заголовки ответа, которые инструктируют браузеры применять политики безопасности, защищая веб-приложения от XSS, кликджекинга, сниффинга типов MIME и других распространённых атак с минимальными усилиями по реализации. По данным Mozilla Web Security Observatory, только 35% веб-сайтов правильно реализуют Content Security Policy (CSP), а 45% не имеют HTTP Strict Transport Security (HSTS). По данным OWASP, отсутствующие или неправильно настроенные заголовки безопасности ответственны примерно за 30% уязвимостей безопасности веб-приложений, обнаруженных при тестировании на проникновение. Для QA-инженеров автоматизированное тестирование заголовков безопасности с инструментами Mozilla Observatory или Playwright обеспечивает воспроизводимую проверку.

TL;DR: Проверяй 8 критических заголовков безопасности: Content-Security-Policy, Strict-Transport-Security (HSTS), X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, Cross-Origin-Resource-Policy и Cross-Origin-Opener-Policy. Используй Mozilla Observatory, SecurityHeaders.com или автоматизированные тесты в CI/CD. Стремись к оценке A+ в Mozilla Observatory.

Основные Заголовки

1. Content-Security-Policy (CSP)

Content-Security-Policy: default-src 'self'; script-src 'self'

2. Strict-Transport-Security (HSTS)

Strict-Transport-Security: max-age=31536000; includeSubDomains

3. X-Frame-Options

X-Frame-Options: DENY

“Security headers are the easiest security wins a web team can implement — CSP, HSTS, and X-Frame-Options take an hour to configure but protect against entire classes of attacks that take years to discover in code.” — Yuri Kan, Senior QA Lead

Тестирование

def test_security_headers():
    response = requests.get("https://example.com")

    assert 'Content-Security-Policy' (как обсуждается в [OWASP ZAP Automation: Security Scanning in CI/CD](/ru/blog/owasp-zap-automation)) in response.headers
    assert 'Strict-Transport-Security' (как обсуждается в [Penetration Testing Basics for QA Testers](/ru/blog/penetration-testing-basics)) in response.headers
    assert 'X-Frame-Options' in response.headers

Инструменты

  • SecurityHeaders.com
  • Mozilla Observatory
  • Пользовательские скрипты

Реализация

Node.js

const helmet = require('helmet');
app.use(helmet());

Nginx

add_header Content-Security-Policy "default-src 'self'" always;
add_header Strict-Transport-Security "max-age=31536000" always;

Заключение

Security headers — критически важный защитный слой. Регулярное тестирование обеспечивает правильную реализацию и защиту от распространенных веб-уязвимостей.

FAQ

Какие security headers нужно внедрить в первую очередь?

Начни с Strict-Transport-Security (HSTS) для принудительного HTTPS, Content-Security-Policy (CSP) для предотвращения XSS-атак и X-Frame-Options со значением DENY для блокировки кликджекинга. Эти три заголовка защищают от наиболее распространённых векторов атак. Затем добавь X-Content-Type-Options: nosniff и Referrer-Policy: strict-origin-when-cross-origin. Стремись к оценке A+ в Mozilla Observatory как ориентиру.

Как тестировать security headers в CI/CD пайплайне?

Добавь автоматические проверки заголовков в CI/CD с помощью pytest и библиотеки requests для валидации каждого заголовка. Как альтернативу используй API SecurityHeaders.com или Mozilla Observatory для автоматической оценки. Запускай проверки на staging-окружении после каждого деплоя. Ставь пайплайн в fail, если критические заголовки вроде HSTS или CSP отсутствуют или неправильно настроены.

Что такое Content Security Policy и почему его сложно внедрить?

Content Security Policy (CSP) — HTTP-заголовок, который указывает браузерам, какие источники контента разрешены на странице, эффективно предотвращая XSS-атаки. Его сложно внедрить, потому что слишком строгий CSP ломает легитимный функционал (inline-скрипты, сторонние виджеты), а слишком мягкий даёт мало защиты. Начни с CSP в режиме report-only для выявления нарушений без поломки сайта, затем постепенно ужесточай директивы.

Нужно ли удалять заголовки X-Powered-By и Server?

Да, всегда удаляй или минимизируй заголовки, раскрывающие информацию. X-Powered-By выдаёт стек технологий (PHP, Express), а детальный Server-заголовок раскрывает версию веб-сервера (Apache/2.4.51). Атакующие используют эту информацию для нацеливания на известные уязвимости конкретных версий. В Nginx установи server_tokens off. В Express используй middleware helmet, который удаляет X-Powered-By по умолчанию.

Официальные ресурсы

See Also