CORS заголовки

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

CORS (Cross-Origin Resource Sharing) — механизм, позволяющий браузеру делать запросы к другому домену. Для REST API на PHP нужно правильно настроить CORS-заголовки.

Основные заголовки:

  • Access-Control-Allow-Origin — разрешённые домены
  • Access-Control-Allow-Methods — разрешённые HTTP-методы
  • Access-Control-Allow-Headers — разрешённые заголовки запроса
  • Access-Control-Max-Age — время кэширования preflight

Браузер сначала отправляет preflight-запрос методом OPTIONS. Этот тренажер поможет на практике освоить настройку CORS в PHP. Интерактивные задания покажут, как правильно обрабатывать кросс-доменные запросы к вашему API.

Список тем

1. Разрешить все домены

id: 39284_cors_01_replace

В этом задании вам необходимо правильно настроить CORS заголовок для REST API, чтобы разрешить доступ с любых доменов. В представленном фрагменте PHP-кода используется функция header() для отправки заголовков HTTP. Ваша задача — заполнить пропуск в аргументе функции так, чтобы сервер разрешал запросы с любого источника (origin). Это стандартная практика при разработке публичных API или на этапе тестирования, когда требуется временно разрешить доступ всем.

Заполните пропуски
<?php
// Настройка CORS заголовков для REST API
header('Content-Type: application/json');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
// Разрешить доступ с любого домена
header('Access-Control-Allow-Origin: input1S');

// Далее идёт код обработки запроса...
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. CORS-заголовки и назначение

id: 39284_cors_02_compare

В данном задании вам необходимо сопоставить CORS-заголовки (левая колонка) с их назначением (правая колонка). Каждый заголовок из списка слева имеет строго определённое назначение, указанное справа. Обратите внимание, что количество элементов в обеих колонках одинаковое, и каждому заголовку соответствует только одно правильное описание его функциональности в контексте механизма Cross-Origin Resource Sharing.

Сопоставьте строки в правой(нижней) части с соответствующими строками в левой(верхней) по порядковому номеру
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Max-Age
Разрешённые домены (источники запроса)
Время кэширования preflight-запроса (в секундах)
Разрешённые заголовки запроса (например, Content-Type, Authorization)
Разрешённые HTTP-методы (например, GET, POST, PUT)
Сообщения
Проверить
Показать подсказку

3. Ошибка в методах

id: 39284_cors_03_error

При работе с REST API важно правильно настраивать CORS заголовки для разрешения кросс-доменных запросов. В этом фрагменте PHP-кода допущена ошибка в указании разрешённых HTTP-методов в заголовке Access-Control-Allow-Methods. Неправильный формат может привести к тому, что браузеры не смогут корректно обработать предварительный запрос (preflight) OPTIONS. Найдите и исправьте строку с ошибкой.

Найдите ошибку и исправьте
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET POST PUT');
header('Access-Control-Allow-Headers: Content-Type');
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Обработка preflight

id: 39284_cors_04_build

Из предложенных строк соберите корректный PHP-скрипт, который обрабатывает preflight (предварительный) запрос OPTIONS для реализации CORS. Скрипт должен проверить метод запроса и, если это OPTIONS, отправить три заголовка CORS (Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Max-Age) в любом порядке, затем завершить выполнение. Порядок отправки этих трёх заголовков не влияет на результат и все варианты должны считаться верными.

Перетяните в правильном порядке строки из одного блока в другой
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
    header('Access-Control-Max-Age: 86400');
    exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json');
    echo json_encode(['error' => 'Method not allowed']);
    http_response_code(405);
    header('Access-Control-Allow-Headers: Content-Type');
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Пройдёт ли запрос?

id: 39284_cors_05_predict

Проанализируйте конфигурацию CORS заголовков сервера и определите, будет ли успешно выполнен указанный HTTP-запрос с учётом политики безопасности браузера. Обратите внимание на проверку домена источника запроса и разрешённых методов.

Выберите правильный вариант ответа

Сервер возвращает следующие HTTP-заголовки в ответ на предзапрос OPTIONS:

Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST

Будет ли браузер разрешать выполнение PUT-запроса, отправленного со страницы, загруженной с https://example.com?

Сообщения
Проверить
Показать подсказку

6. Заголовки запроса и ответа

id: 39284_cors_06_sort

Перед вами список заголовков, используемых в контексте CORS (Cross-Origin Resource Sharing). Ваша задача — распределить эти заголовки по двум категориям: «Отправляет сервер» и «Отправляет браузер». CORS-заголовки делятся на те, которые сервер отправляет в ответе, разрешая определённые cross-origin-запросы, и те, которые браузер отправляет в предварительных (preflight) или обычных запросах, указывая детали запроса. Обратите внимание на семантику и назначение каждого заголовка.

Перетяните элементы в соответствующие блоки
Отправляет сервер
Отправляет браузер
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Origin
Access-Control-Request-Method
Access-Control-Request-Headers
Сообщения
Проверить
Показать подсказку

7. Настройка кэширования

id: 39284_cors_07_bank

В этом задании вам нужно правильно настроить заголовок кэширования preflight-запросов для CORS на 1 час. В приведённом коде PHP есть пропуски, которые необходимо заполнить, выбрав подходящие части из банка вариантов. Соберите корректный заголовок Access-Control-Max-Age со значением 3600 секунд (1 час).

Нужно правильно расставить в пропуски предложенные варианты
header('Access-Control-input1S-input2S: 3600');
Max
Age
Allow
Cache
Time
Max
Age
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Порядок CORS-проверки

id: 39284_cors_08_sequencing

Перед вами описания этапов CORS-проверки при взаимодействии браузера с сервером в кросс-доменном запросе. Эти этапы перемешаны. Расставьте их в правильной логической последовательности, отражающей стандартный порядок обработки CORS (Cross-Origin Resource Sharing) для небезопасных HTTP-запросов (например, POST с определёнными типами контента). Важно понимать, что браузер выполняет предварительную проверку (preflight), чтобы убедиться, что сервер разрешает кросс-доменный запрос.

Расставьте строки в правильном порядке
Браузер отправляет предварительный (preflight) запрос типа OPTIONS на сервер для выяснения разрешённых методов и заголовков.
Сервер получает OPTIONS-запрос и отправляет ответ с CORS-заголовками (Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers).
Браузер отправляет основной запрос (например, POST с данными) на сервер, так как получил разрешение на preflight-этапе.
Браузер проверяет полученные CORS-заголовки в ответе на preflight-запрос. Если заголовки разрешают исходный запрос, браузер переходит к его отправке.
Сервер обрабатывает основной запрос (POST, PUT и т.д.) и возвращает окончательный ответ с данными, также включая CORS-заголовки (например, Access-Control-Allow-Origin) в этом ответе.
Сообщения
Проверить
Показать подсказку

9. Найди небезопасную настройку

id: 39284_cors_09_click

Внимательно изучите фрагмент PHP-кода, который настраивает CORS-заголовки для REST API. Ваша задача — найти и выделить кликом те строки с вызовом функции header(), которые вместе образуют небезопасную конфигурацию CORS. Помните, что небезопасной считается комбинация, когда заголовок Access-Control-Allow-Origin установлен в значение "*" (звёздочка, разрешающая запросы с любого источника), одновременно с включённым заголовком Access-Control-Allow-Credentials: true (разрешение передавать учётные данные). Выделите только те строки, которые создают эту опасную пару, и не отмечайте другие, безопасные заголовки.

Кликните по всем фрагментам, которые подходят под условие задания.
<?php
// Фрагмент обработки CORS-запросов в REST API

// Безопасные заголовки по умолчанию
{{header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');~|~t1}}
{{header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');~|~t2}}
{{header('Access-Control-Max-Age: 3600');~|~t3}}

// Конфигурация для основного клиентского приложения
{{header('Access-Control-Allow-Origin: https://trusted-client.com');~|~t4}}
{{header('Access-Control-Allow-Credentials: true');~|~t5}}

// ОПАСНЫЙ БЛОК для временного тестирования (нельзя использовать в продакшене)
if (isset($_GET['debug_cors'])) {
    {{header('Access-Control-Allow-Origin: *');~|~t6}}
    {{header('Access-Control-Allow-Credentials: true');~|~t7}}
}

// Дополнительные заголовки ответа
header('Content-Type: application/json; charset=UTF-8');

// ... дальнейшая логика API
?>
Сообщения
Проверить
Показать подсказку

10. Метод preflight-запроса

id: 39284_cors_10_give

При реализации CORS (Cross-Origin Resource Sharing) браузер может автоматически отправлять предварительный (preflight) запрос для проверки разрешений, прежде чем выполнить основной запрос (например, POST с нестандартными заголовками). Этот предварительный запрос использует специальный HTTP-метод для опроса сервера о разрешенных методах и заголовках. Назовите этот HTTP-метод. Введите одно слово в поле ответа.

Что должно получиться?

Когда браузеру необходимо проверить, разрешён ли кросс-доменный запрос (например, запрос с нестандартными заголовками или методом, отличным от простых методов), он отправляет предварительный (preflight) запрос.

Этот запрос отправляется автоматически браузером, и его цель — получить от сервера список разрешённых методов, заголовков и других параметров CORS.

Вопрос: Какой HTTP-метод используется браузером для отправки preflight-запроса в рамках проверки CORS?

Введите название метода (одно слово) в поле ниже.

Сообщения
Проверить
Показать подсказку

PHP: запуск кода в браузере

id: 39284_compiler
🐘
Запустить тренажёр (PHP)
НайтиКурс.Ру