Прямой ответ
Security headers защищают API от распространённых атак, поэтому настройка заголовков ограничивает возможности злоумышленника.
| Заголовок | Что защищает |
|---|---|
| X-Content-Type-Options | От MIME-sniffing атак |
| X-Frame-Options | От clickjacking |
| Content-Security-Policy | От XSS и injection |
| Strict-Transport-Security | От downgrade атак |
from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(TrustedHostMiddleware, allowed_hosts=["api.example.com"])
@app.middleware("http")
async def security_headers(request, call_next):
response = await call_next(request)
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["X-Frame-Options"] = "DENY"
return response
Заголовки безопасности ограничивают возможности браузера, поэтому атаки, использующие недостатки браузера, не выполняются. О CORS настройке — в статье про CORS практику.
Основные заголовки и их назначение
Каждый заголовок защищает от конкретного типа атаки, поэтому настройка всех заголовков обеспечивает комплексную защиту.
X-Content-Type-Options. Запрещает MIME-sniffing, поэтому браузер не интерпретирует контент как другой тип.
X-Frame-Options. Запрещает встраивание в iframe, поэтому clickjacking атаки не выполняются.
Content-Security-Policy. Ограничивает источники контента, поэтому XSS и injection атаки не выполняются.
Практическое следствие: отсутствие заголовков позволяет браузеру интерпретировать контент произвольно, поэтому атаки выполняются.
Отдельный аспект — Strict-Transport-Security. Заголовок требует HTTPS, поэтому downgrade атаки не выполняются.
Три признака некорректной настройки.
Отсутствие X-Content-Type-Options. Браузер интерпретирует контент произвольно, поэтому MIME-sniffing атаки выполняются.
Отсутствие X-Frame-Options. Встраивание в iframe разрешено, поэтому clickjacking атаки выполняются.
Отсутствие Content-Security-Policy. Источники контента не ограничены, поэтому XSS и injection атаки выполняются.
О защите от атак — в статье про защиту API от атак; о Content-Security-Policy — в статье про CSP настройку.
Проверка заголовков и диагностика
Проверка заголовков безопасности при запуске обнаруживает отсутствие заголовка до начала обработки запросов.
Проверка при запуске. Отсутствие заголовка обнаруживается до начала обработки запросов, поэтому сбой не возникает после запуска.
Фиксация в логе. Запись заголовков позволяет определить, какие заголовки были отправлены при диагностике.
Ограничение источников в CSP. Ограничение источников контента предотвращает загрузку вредоносного контента.
Практическое следствие: отсутствие проверки приводит к тому, что отсутствие заголовка не обнаруживается до начала обработки запросов.
Практика: настройка security headers
1. Добавляйте X-Content-Type-Options. Запрет MIME-sniffing предотвращает интерпретацию контента как другого типа.
2. Добавляйте X-Frame-Options. Запрет встраивания в iframe предотвращает clickjacking атаки.
3. Добавляйте Content-Security-Policy. Ограничение источников контента предотвращает XSS и injection атаки.
4. Добавляйте Strict-Transport-Security. Требование HTTPS предотвращает downgrade атаки.
5. Проверяйте заголовки при запуске. Отсутствие заголовка обнаруживается до начала обработки запросов.
6. Фиксируйте заголовки в логе. Запись заголовков позволяет определить, какие заголовки были отправлены.
7. Ограничивайте источники контента в CSP. Ограничение источников предотвращает загрузку вредоносного контента.
Рекомендации:
- Не пропускайте заголовки безопасности. Отсутствие заголовка позволяет браузеру интерпретировать контент произвольно.
- Учитывайте назначение каждого заголовка. Каждый заголовок защищает от конкретного типа атаки.
- Сопоставляйте заголовки с типом атаки. Заголовок защищает от конкретной атаки, поэтому настройка всех заголовков обеспечивает комплексную защиту.
- Фиксируйте заголовки в ошибке. Признак в записи ошибки позволяет определить, какой заголовок отсутствовал.
- Пересматриваем заголовки при изменении требований. Новая атака требует добавления заголовка.
Практический сценарий: заголовки безопасности отсутствовали
Контекст: проверка показала, что заголовки безопасности отсутствовали, поэтому атаки выполнялись.
- Диагностика. Проверка заголовков ответа показала, что X-Content-Type-Options, X-Frame-Options и Content-Security-Policy отсутствовали. Отсутствие заголовков позволяло браузеру интерпретировать контент произвольно, поэтому атаки выполнялись.
- Причина. Заголовки безопасности не были настроены, поэтому защита от атак отсутствовала.
- Действия. (а) Добавили X-Content-Type-Options, чтобы запретить MIME-sniffing; (б) добавили X-Frame-Options, чтобы запретить встраивание в iframe; (в) добавили Content-Security-Policy, чтобы ограничить источники контента; (г) добавили Strict-Transport-Security, чтобы требовать HTTPS; (д) настроили проверку заголовков при запуске, чтобы отсутствие заголовка обнаруживалось.
- Результат. Заголовки безопасности отправляются, поэтому атаки не выполняются.
Вывод: отсутствие заголовков безопасности позволяет браузеру интерпретировать контент произвольно, поэтому атаки выполняются. Настройка заголовков ограничивает возможности браузера, поэтому атаки не выполняются.
Дополнительная защита
Referrer-Policy. Заголовок ограничивает передачу referer, поэтому информация о источнике запроса не раскрывается.
Permissions-Policy. Заголовок ограничивает доступ к функциям браузера, поэтому несанкционированный доступ к камере и микрофону prevented.
Cross-Origin-Opener-Policy. Заголовок изолирует окно браузера, поэтому атаки через window.opener prevented.
Cross-Origin-Embedder-Policy. Заголовок требует явного разрешения для встраивания ресурсов, поэтому несанкционированное встраивание prevented.
Cross-Origin-Resource-Policy. Заголовок ограничивает, какие источники могут загружать ресурс, поэтому несанкционированная загрузка prevented.
Практическое следствие: отсутствие дополнительных заголовков позволяет раскрытие информации, несанкционированный доступ к функциям браузера, атаки через window.opener и несанкционированную загрузку ресурсов.
Практический сценарий: заголовки безопасности отсутствовали
Контекст: проверка показала, что заголовки безопасности отсутствовали, поэтому атаки выполнялись.
- Диагностика. Проверка заголовков ответа показала, что X-Content-Type-Options, X-Frame-Options и Content-Security-Policy отсутствовали. Отсутствие заголовков позволяло браузеру интерпретировать контент произвольно, поэтому атаки выполнялись.
- Причина. Заголовки безопасности не были настроены, поэтому защита от атак отсутствовала.
- Действия. (а) Добавили X-Content-Type-Options, чтобы запретить MIME-sniffing; (б) добавили X-Frame-Options, чтобы запретить встраивание в iframe; (в) добавили Content-Security-Policy, чтобы ограничить источники контента; (г) добавили Strict-Transport-Security, чтобы требовать HTTPS; (д) настроили проверку заголовков при запуске, чтобы отсутствие заголовка обнаруживалось.
- Результат. Заголовки безопасности отправляются, поэтому атаки не выполняются.
Вывод: отсутствие заголовков безопасности позволяет браузеру интерпретировать контент произвольно, поэтому атаки выполняются. Настройка заголовков ограничивает возможности браузера, поэтому атаки не выполняются.
FAQ
Какие заголовки безопасности обязательны? X-Content-Type-Options, X-Frame-Options, Content-Security-Policy и Strict-Transport-Security. Каждый заголовок защищает от конкретного типа атаки.
Как проверяются заголовки? Проверка заголовков ответа выполняется при запуске. Отсутствие заголовка обнаруживается до начала обработки запросов.
Что защищает Content-Security-Policy? CSP ограничивает источники контента, поэтому XSS и injection атаки не выполняются. Загрузка вредоносного контента предотвращается.
Как настраиваются заголовки в API? Через middleware, добавляющий заголовки к каждому ответу. Заголовки отправляются со всеми ответами, поэтому защита обеспечивается.
Источники: OWASP Secure Headers, MDN HTTP Headers, FastAPI middleware — ссылки в шапке.