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

Главная → Статьи → CORS: практика настройки

CORS: настройка кросс-доменных запросов

CORS практика: настройка разрешённых источников, методов, заголовков и проверка кросс-доменных запросов.

Прямой ответ

CORS настройка определяет, какие источники могут выполнять кросс-доменные запросы, поэтому несанкционированный доступ к API предотвращается.

Параметр Что задаёт
Разрешённые источники Какие домены могут обращаться
Разрешённые методы Какие HTTP методы разрешены
Разрешённые заголовки Какие заголовки можно отправлять
Credentials Разрешена ли отправка cookies
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=[""],
    allow_methods=["GET", "POST"],
    allow_headers=["Authorization"],
    allow_credentials=True,
)

Разрешённые источники ограничивают, какие домены могут обращаться к API, поэтому несанкционированный доступ предотвращается. О security headers — в статье про security headers.

Разрешённые источники, методы и заголовки

Настройка разрешённых источников, методов и заголовков определяет, какие запросы выполняются, поэтому несанкционированный доступ предотвращается.

Разрешённые источники. Список доменов, которые могут обращаться к API, поэтому запросы с других доменов отклоняются.

Разрешённые методы. Список HTTP методов, которые разрешены, поэтому запросы с другими методами отклоняются.

Разрешённые заголовки. Список заголовков, которые можно отправлять, поэтому запросы с другими заголовками отклоняются.

Практическое следствие: разрешение всех источников (*) позволяет любому домену обращаться к API, поэтому несанкционированный доступ не предотвращается.

Отдельный аспект — credentials. Разрешение отправки cookies требует явного указания источников, поэтому wildcard (*) не используется.

Три признака некорректной настройки CORS.

Разрешение всех источников. Wildcard (*) позволяет любому домену обращаться к API, поэтому несанкционированный доступ не предотвращается.

Разрешение всех методов. Все HTTP методы разрешены, поэтому запросы с опасными методами выполняются.

Отсутствие проверки заголовков. Заголовки не проверяются, поэтому запросы с произвольными заголовками выполняются.

О защите от атак — в статье про защиту API от атак; о CORS и безопасности браузера — в статье про CORS и безопасность.

Проверка источников и диагностика

Проверка разрешённых источников при запуске обнаруживает отсутствие настройки до начала обработки запросов.

Проверка при запуске. Отсутствие настройки CORS обнаруживается до начала обработки запросов, поэтому сбой не возникает после запуска.

Фиксация в логе. Запись CORS позволяет определить, какие источники разрешены при диагностике.

Разделение по окружениям. Источники разработки и продакшена различаются, поэтому окружения разделяются.

Практическое следствие: отсутствие проверки приводит к тому, что отсутствие настройки CORS не обнаруживается до начала обработки запросов.

Практика: настройка CORS

1. Указывайте разрешённые источники явно. Список доменов ограничивает, какие источники могут обращаться к API.

2. Ограничивайте разрешённые методы. Список методов предотвращает выполнение запросов с опасными методами.

3. Проверяйте разрешённые заголовки. Список заголовков предотвращает выполнение запросов с произвольными заголовками.

4. Не используйте wildcard (*) с credentials. Разрешение отправки cookies требует явного указания источников.

5. Проверяйте CORS при запуске. Отсутствие настройки обнаруживается до начала обработки запросов.

6. Фиксируйте CORS в логе. Запись CORS позволяет определить, какие источники разрешены.

7. Ограничивайте источники по окружениям. Источники разработки и продакшена различаются, поэтому окружения разделяются.

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

  1. Не используйте wildcard (*) для источников. Разрешение всех источников позволяет любому домену обращаться к API.
  2. Учитывайте credentials при настройке. Разрешение отправки cookies требует явного указания источников.
  3. Сопоставляйте источники с окружением. Источники продакшена отличаются от разработки, поэтому окружения разделяются.
  4. Фиксируйте CORS в ошибке. Признак в записи ошибки позволяет определить, какой источник не разрешён.
  5. Пересматриваем источники при изменении требований. Новый источник требует добавления в список разрешённых.

Практический сценарий: кросс-доменный запрос не выполнился

Контекст: кросс-доменный запрос не выполнился, поэтому приложение не получило данные.

  1. Диагностика. Проверка показала, что источник запроса не был в списке разрешённых. Браузер отклонил запрос, поэтому данные не были получены.
  2. Причина. Источник не был добавлен в список разрешённых, поэтому кросс-доменный запрос отклонялся.
  3. Действия. (а) Добавили источник в список разрешённых, чтобы запрос выполнялся; (б) ограничили разрешённые методы, чтобы запросы с опасными методами отклонялись; (в) проверили разрешённые заголовки, чтобы запросы с произвольными заголовками отклонялись; (г) настроили проверку CORS при запуске, чтобы отсутствие настройки обнаруживалось; (д) разделили источники по окружениям, чтобы значения не смешивались.
  4. Результат. Кросс-доменный запрос выполняется, поэтому приложение получает данные.

Вывод: отсутствие источника в списке разрешённых приводит к отклонению кросс-доменного запроса. Настройка разрешённых источников, методов и заголовков обеспечивает выполнение запросов с разрешённых источников.

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

Preflight запросы. Браузер отправляет preflight запрос для проверки разрешений, поэтому несанкционированный запрос не выполняется.

Кэширование preflight. Кэширование preflight ответов снижает нагрузку, поэтому проверка выполняется реже.

Практическое следствие: отсутствие preflight запросов и кэширования приводит к тому, что несанкционированные запросы выполняются и нагрузка на сервер увеличивается.

Практический сценарий: кросс-доменный запрос не выполнился

Контекст: кросс-доменный запрос не выполнился, поэтому приложение не получило данные.

  1. Диагностика. Проверка показала, что источник запроса не был в списке разрешённых. Браузер отклонил запрос, поэтому данные не были получены.
  2. Причина. Источник не был добавлен в список разрешённых, поэтому кросс-доменный запрос отклонялся.
  3. Действия. (а) Добавили источник в список разрешённых, чтобы запрос выполнялся; (б) ограничили разрешённые методы, чтобы запросы с опасными методами отклонялись; (в) проверили разрешённые заголовки, чтобы запросы с произвольными заголовками отклонялись; (г) настроили проверку CORS при запуске, чтобы отсутствие настройки обнаруживалось; (д) разделили источники по окружениям, чтобы значения не смешивались.
  4. Результат. Кросс-доменный запрос выполняется, поэтому приложение получает данные.

Вывод: отсутствие источника в списке разрешённых приводит к отклонению кросс-доменного запроса. Настройка разрешённых источников, методов и заголовков обеспечивает выполнение запросов с разрешённых источников.

FAQ

Что такое CORS? Механизм, определяющий, какие источники могут выполнять кросс-доменные запросы. Настройка ограничивает несанкционированный доступ к API.

Как настраиваются разрешённые источники? Через явное указание списка доменов. Wildcard (*) не используется с credentials, поэтому источники указываются явно.

Какие методы разрешать? Только методы, необходимые для работы API. Разрешение всех методов позволяет выполнение запросов с опасными методами.

Как проверяется CORS? Проверка настройки выполняется при запуске. Отсутствие настройки обнаруживается до начала обработки запросов.

Источники: MDN CORS, FastAPI CORS, OWASP CORS — ссылки в шапке.