Проверка CORS и Security Headers

Анализ CORS-политики (Access-Control-Allow-Origin), Preflight-запросов, а также всех заголовков безопасности: CSP, HSTS, X-Frame-Options и других.

Введите URL и нажмите «Проверить».

Настройка CORS

Что такое CORS?

CORS (Cross-Origin Resource Sharing) — механизм, который позволяет серверу разрешить загрузку ресурсов с других доменов. Браузер блокирует cross-origin запросы, если сервер не отправит правильный заголовок Access-Control-Allow-Origin.

Пример: ваш фронтенд на app.example.com делает fetch к API на api.example.com. Без CORS браузер заблокирует запрос.

Nginx
location /api/ {
    # Разрешить конкретный источник (без credentials можно *)
    add_header Access-Control-Allow-Origin "https://app.example.com" always;

    # Разрешённые методы
    add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always;

    # Разрешённые заголовки
    add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With" always;

    # Заголовки, доступные JS-клиенту
    add_header Access-Control-Expose-Headers "Content-Length, X-Request-Id" always;

    # Передача кук и авторизации (нельзя вместе с Allow-Origin: *)
    add_header Access-Control-Allow-Credentials "true" always;

    # Кэширование preflight-ответа (в секундах)
    add_header Access-Control-Max-Age "86400" always;

    # Обработка preflight (OPTIONS)
    if ($request_method = OPTIONS) {
        return 204;
    }
}

Директива always — заголовок отправляется всегда, включая ответы с кодами 4xx/5xx.

FastAPI (Python)
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://app.example.com"],
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE"],
    allow_headers=["Content-Type", "Authorization"],
    expose_headers=["Content-Length", "X-Request-Id"],
    max_age=86400,
)
Django (Python)
# pip install django-cors-headers

INSTALLED_APPS = [
    ...,
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...,
]

CORS_ALLOWED_ORIGINS = [
    "https://app.example.com",
]
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_METHODS = ["GET", "POST", "PUT", "DELETE"]
CORS_ALLOW_HEADERS = ["Content-Type", "Authorization"]
CORS_EXPOSE_HEADERS = ["Content-Length", "X-Request-Id"]
CORS_PREFLIGHT_MAX_AGE = 86400
Express (Node.js)
const cors = require('cors');

app.use(cors({
    origin: 'https://app.example.com',
    credentials: true,
    methods: ['GET', 'POST', 'PUT', 'DELETE'],
    allowedHeaders: ['Content-Type', 'Authorization'],
    exposedHeaders: ['Content-Length', 'X-Request-Id'],
    maxAge: 86400,
}));
Apache
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "https://app.example.com"
    Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    Header set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"
    Header set Access-Control-Expose-Headers "Content-Length, X-Request-Id"
    Header set Access-Control-Allow-Credentials "true"
    Header set Access-Control-Max-Age "86400"
</IfModule>

# Preflight
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=204,L]
Безопасность CORS
  • Не используйте Access-Control-Allow-Origin: * если передаются cookie или авторизация. * не работает с allowCredentials: true.
  • Явно перечисляйте разрешённые источники — не используйте динамическое отражение Origin без валидации (риск атак).
  • Ограничивайте методы — не разрешайте PUT/DELETE если API только читает данные.
  • Preflight кэширование — ставьте Access-Control-Max-Age чтобы браузер не слал OPTIONS перед каждым запросом.
  • Expose-Headers — без этого заголовка JS-клиент не увидит кастомные заголовки ответа.
  • Vary: Origin — при динамическом Allow-Origin добавляйте Vary: Origin для корректного кэширования.