Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Security headers API: практика

Security headers API: защита от атак

Security headers для API: основные заголовки, настройка, проверка и защита от распространённых атак.

Прямой ответ

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. Ограничение источников предотвращает загрузку вредоносного контента.

Рекомендации:

  1. Не пропускайте заголовки безопасности. Отсутствие заголовка позволяет браузеру интерпретировать контент произвольно.
  2. Учитывайте назначение каждого заголовка. Каждый заголовок защищает от конкретного типа атаки.
  3. Сопоставляйте заголовки с типом атаки. Заголовок защищает от конкретной атаки, поэтому настройка всех заголовков обеспечивает комплексную защиту.
  4. Фиксируйте заголовки в ошибке. Признак в записи ошибки позволяет определить, какой заголовок отсутствовал.
  5. Пересматриваем заголовки при изменении требований. Новая атака требует добавления заголовка.

Практический сценарий: заголовки безопасности отсутствовали

Контекст: проверка показала, что заголовки безопасности отсутствовали, поэтому атаки выполнялись.

  1. Диагностика. Проверка заголовков ответа показала, что X-Content-Type-Options, X-Frame-Options и Content-Security-Policy отсутствовали. Отсутствие заголовков позволяло браузеру интерпретировать контент произвольно, поэтому атаки выполнялись.
  2. Причина. Заголовки безопасности не были настроены, поэтому защита от атак отсутствовала.
  3. Действия. (а) Добавили X-Content-Type-Options, чтобы запретить MIME-sniffing; (б) добавили X-Frame-Options, чтобы запретить встраивание в iframe; (в) добавили Content-Security-Policy, чтобы ограничить источники контента; (г) добавили Strict-Transport-Security, чтобы требовать HTTPS; (д) настроили проверку заголовков при запуске, чтобы отсутствие заголовка обнаруживалось.
  4. Результат. Заголовки безопасности отправляются, поэтому атаки не выполняются.

Вывод: отсутствие заголовков безопасности позволяет браузеру интерпретировать контент произвольно, поэтому атаки выполняются. Настройка заголовков ограничивает возможности браузера, поэтому атаки не выполняются.

Дополнительная защита

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 и несанкционированную загрузку ресурсов.

Практический сценарий: заголовки безопасности отсутствовали

Контекст: проверка показала, что заголовки безопасности отсутствовали, поэтому атаки выполнялись.

  1. Диагностика. Проверка заголовков ответа показала, что X-Content-Type-Options, X-Frame-Options и Content-Security-Policy отсутствовали. Отсутствие заголовков позволяло браузеру интерпретировать контент произвольно, поэтому атаки выполнялись.
  2. Причина. Заголовки безопасности не были настроены, поэтому защита от атак отсутствовала.
  3. Действия. (а) Добавили X-Content-Type-Options, чтобы запретить MIME-sniffing; (б) добавили X-Frame-Options, чтобы запретить встраивание в iframe; (в) добавили Content-Security-Policy, чтобы ограничить источники контента; (г) добавили Strict-Transport-Security, чтобы требовать HTTPS; (д) настроили проверку заголовков при запуске, чтобы отсутствие заголовка обнаруживалось.
  4. Результат. Заголовки безопасности отправляются, поэтому атаки не выполняются.

Вывод: отсутствие заголовков безопасности позволяет браузеру интерпретировать контент произвольно, поэтому атаки выполняются. Настройка заголовков ограничивает возможности браузера, поэтому атаки не выполняются.

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 — ссылки в шапке.