Проверка 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для корректного кэширования.