Тестер системы CORS

Далее

Ошибки типа CORS характеризуются классическим красным сигналом в консоли браузера: при запросе на API из другого источника браузер блокирует ответ. Этот тестер отправляет предварительный запрос OPTIONS по любому введённому URL, с выбранным вами источником и методом, затем декодирует заголовки Access-Control*, чтобы точно определить, что сервер разрешает, что он блокирует и почему браузер выдаёт ошибку.

Как проверить поддержку CORS

  1. 1

    Введите целевой URL-адрес

    Эндпойнт API, который необходимо вызвать из фронт-энда. Укажите строку запроса и протокол.

  2. 2

    Установите метод и исходную точку

    GET/POST/PUT/DELETE/PATCH. Оригинальный адрес может быть URL вашего сайта или любым иным адресом, который вы хотите имитировать.

  3. 3

    Поймите preflight

    Тестер всегда отправляет запрос OPTIONS с выбранными вами источником и методом, а также заголовком Access-Control-Request-Headers: Content-Type, ровно тот preflight, который браузер отправляет перед JSON-запросом.

  4. 4

    Проведите тест

    Тестер отправляет preflight и передаёт HTTP-статус, а также заголовки ответа CORS: Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials и Max-Age.

  5. 5

    Устраните неправильную конфигурацию

    В отчёте указываются недостающие или неверные данные: отсутствие поля Allow-Origin, наличие запрещённого заголовка или использование недопустимого метода.

Важные заголовки

Заголовок Назначение
Access-Control-Allow-Origin Какие источники могут читать ответ
Access-Control-Allow-Methods Preflight: какие методы разрешены
Access-Control-Allow-Headers Preflight: какие заголовки запроса разрешены
Access-Control-Allow-Credentials Разрешены ли cookie/аутентификация
Access-Control-Expose-Headers Какие заголовки ответа может читать JS
Access-Control-Max-Age Сколько кэшируется результат preflight

Простые запросы и запросы с preflight

Запрос считается «простым» (без preflight) только если выполнены все условия:

  • Метод, GET, HEAD или POST.
  • Заголовки ограничены Accept, Accept-Language, Content-Language, Content-Type (с определёнными значениями).
  • Content-Type, если он есть, это application/x-www-form-urlencoded, multipart/form-data или text/plain.

Всё остальное, тело JSON, заголовок Authorization, пользовательский заголовок X-Foo, метод PUT/DELETE/PATCH, вызывает preflight OPTIONS. Сервер должен ответить на preflight правильными заголовками Allow-*, иначе реальный запрос так и не будет отправлен.

Частые ошибки CORS

  • «No Access-Control-Allow-Origin header» → сервер не задаёт этот заголовок. Исправляйте на стороне сервера, а не клиента.
  • *«Credentials mode requires Allow-Origin not to be » → если вы отправляете cookie, Allow-Origin должен быть конкретным источником (или возвращать заголовок Origin).
  • «Request header X not allowed» → добавьте X в Access-Control-Allow-Headers в ответе на preflight.
  • «Method not allowed» → добавьте метод в Access-Control-Allow-Methods.
  • «Redirect not allowed in preflight» → preflight не может следовать за перенаправлениями. Конечная точка OPTIONS должна отвечать напрямую.

Allow-Origin: * против возврата Origin

Access-Control-Allow-Origin: * удобен, но его нельзя сочетать с учётными данными. В продакшене возвращайте Origin из запроса (после проверки по списку разрешённых) и задавайте Allow-Credentials: true, если нужны cookie.

Прокси как обходной путь

Если вы не управляете сервером, тонкий прокси на вашем собственном домене полностью убирает CORS, браузер видит запрос как same-origin. Многие хостинговые платформы (Vercel, Netlify, Cloudflare) предлагают правила переписывания (rewrite) как раз для этого.

Часто задаваемые вопросы

Чтобы предотвратить доступ вредоносной страницы к конфиденциальным данным на другом сайте с использованием cookie вашего браузера, отсутствие CORS может позволить сайту evil.com запросить внутренний API вашего банка от имени вас. CORS обязывает банк явно разрешать чтение данных из других источников (cross-origin).

Только при разработке. У Chromium есть флаг --disable-web-security, но он затрагивает все сайты и опасен. Правильное решение, заголовки на стороне сервера или прокси.

Postman не является браузером, он полностью игнорирует механизм CORS. Использование CORS обеспечивается исключительно браузерами при запросах на JavaScript. Сервер, работающий в Postman, не обладает автоматической поддержкой стандартов CORS.

Изображения и классические теги <script> загружаются из других источников без CORS, но JavaScript не может читать их содержимое. <img crossorigin> и fetch() уже соблюдают CORS, именно поэтому без него отрисованные на canvas изображения становятся «испорченными» (tainted).

Сопутствующие инструменты

Проверка HTTP-заголовков

Осмотрите каждый HTTP-заголовок ответа, возвращаемый URL, чтобы отладить кэширование, CORS, сжатие и проблемы безопасности.

Калькулятор IP-подсетей

Рассчитайте диапазон подсети, сеть, broadcast, пригодные хосты и wildcard-маску для любого блока IPv4 CIDR с полным покрытием /0 - /32.

Определение MIME-типа файла

Установите реальный тип MIME файла, изучив его магические байты: определение изображений, видео, файлов формата PDF, архивов ZIP, офисных документов и других типов.

Инструмент проверки возраста доменных имен

Узнайте, когда домен был впервые зарегистрирован, а также его возраст в годах, месяцах и днях с использованием данных WHOIS из реестра.

CIDR-калькулятор

Рассчитайте сетевой адрес, широковещательную рассылку, диапазон хостов, используемые IP-адреса и маску подсети для любого блока IPv4 CIDR.

Домен в IP

Разрешите любое доменное имя в его адреса IPv4 (A) и IPv6 (AAAA) и скопируйте их в любой сетевой инструмент.

Инструмент доступен на других языках