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: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Iterator интерфейс
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- IteratorAggregate интерфейс
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Функция htmlspecialchars().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- HTTP методы в REST.
- CORS заголовки.
- Документирование endpoints.
- Модуль 25: Безопасность
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
1. Разрешить все домены
В этом задании вам необходимо правильно настроить 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');
// Далее идёт код обработки запроса...
?>2. CORS-заголовки и назначение
В данном задании вам необходимо сопоставить CORS-заголовки (левая колонка) с их назначением (правая колонка). Каждый заголовок из списка слева имеет строго определённое назначение, указанное справа. Обратите внимание, что количество элементов в обеих колонках одинаковое, и каждому заголовку соответствует только одно правильное описание его функциональности в контексте механизма Cross-Origin Resource Sharing.
Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Max-Age3. Ошибка в методах
При работе с REST API важно правильно настраивать CORS заголовки для разрешения кросс-доменных запросов. В этом фрагменте PHP-кода допущена ошибка в указании разрешённых HTTP-методов в заголовке Access-Control-Allow-Methods. Неправильный формат может привести к тому, что браузеры не смогут корректно обработать предварительный запрос (preflight) OPTIONS. Найдите и исправьте строку с ошибкой.
<?phpheader('Access-Control-Allow-Origin: *');header('Access-Control-Allow-Methods: GET POST PUT');header('Access-Control-Allow-Headers: Content-Type');?>4. Обработка preflight
Из предложенных строк соберите корректный 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');}5. Пройдёт ли запрос?
Проанализируйте конфигурацию CORS заголовков сервера и определите, будет ли успешно выполнен указанный HTTP-запрос с учётом политики безопасности браузера. Обратите внимание на проверку домена источника запроса и разрешённых методов.
Сервер возвращает следующие HTTP-заголовки в ответ на предзапрос OPTIONS:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST
Будет ли браузер разрешать выполнение PUT-запроса, отправленного со страницы, загруженной с https://example.com?
6. Заголовки запроса и ответа
Перед вами список заголовков, используемых в контексте CORS (Cross-Origin Resource Sharing). Ваша задача — распределить эти заголовки по двум категориям: «Отправляет сервер» и «Отправляет браузер». CORS-заголовки делятся на те, которые сервер отправляет в ответе, разрешая определённые cross-origin-запросы, и те, которые браузер отправляет в предварительных (preflight) или обычных запросах, указывая детали запроса. Обратите внимание на семантику и назначение каждого заголовка.
7. Настройка кэширования
В этом задании вам нужно правильно настроить заголовок кэширования preflight-запросов для CORS на 1 час. В приведённом коде PHP есть пропуски, которые необходимо заполнить, выбрав подходящие части из банка вариантов. Соберите корректный заголовок Access-Control-Max-Age со значением 3600 секунд (1 час).
header('Access-Control-input1S-input2S: 3600');8. Порядок CORS-проверки
Перед вами описания этапов CORS-проверки при взаимодействии браузера с сервером в кросс-доменном запросе. Эти этапы перемешаны. Расставьте их в правильной логической последовательности, отражающей стандартный порядок обработки CORS (Cross-Origin Resource Sharing) для небезопасных HTTP-запросов (например, POST с определёнными типами контента). Важно понимать, что браузер выполняет предварительную проверку (preflight), чтобы убедиться, что сервер разрешает кросс-доменный запрос.
9. Найди небезопасную настройку
Внимательно изучите фрагмент 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-запроса
При реализации CORS (Cross-Origin Resource Sharing) браузер может автоматически отправлять предварительный (preflight) запрос для проверки разрешений, прежде чем выполнить основной запрос (например, POST с нестандартными заголовками). Этот предварительный запрос использует специальный HTTP-метод для опроса сервера о разрешенных методах и заголовках. Назовите этот HTTP-метод. Введите одно слово в поле ответа.
Когда браузеру необходимо проверить, разрешён ли кросс-доменный запрос (например, запрос с нестандартными заголовками или методом, отличным от простых методов), он отправляет предварительный (preflight) запрос.
Этот запрос отправляется автоматически браузером, и его цель — получить от сервера список разрешённых методов, заголовков и других параметров CORS.
Вопрос: Какой HTTP-метод используется браузером для отправки preflight-запроса в рамках проверки CORS?
Введите название метода (одно слово) в поле ниже.