Самоучитель: PHP 8.5: инженерный практикум
Глава 9 из 22III. Веб-граница95 минут

Глава 9. HTTP-запрос как недоверенное сообщение

Контроллер переводит конкретное HTTP-сообщение в типизированную команду, но не объявляет поле безопасным только потому, что его отправила ваша форма.

После главы вы сможете
  • прочитать HTTP-контракт
  • создать request DTO
  • выбрать наблюдаемый ответ

Superglobals принадлежат адаптеру

$_GET, $_POST, $_FILES, $_COOKIE и $_SERVER описывают транспорт. Если передать их целиком в сервис, предметная логика начнёт зависеть от регистра заголовка, формы поля и глобального состояния. Контроллер выбирает ожидаемые значения и создаёт команду.

Скрытое поле, disabled input и значение из собственного JavaScript остаются пользовательским вводом. Сервер повторяет проверку формы, диапазона и права на действие. Клиентская валидация отвечает за удобство, не за доверие.

Адаптация запроса

HTTP к прикладной командеВнутренний сценарий не читает глобальные массивы и не формирует HTML.Requestmethod/pathExtractallowlistValidatefield errorsCommandtypedUse casedecision
Внутренний сценарий не читает глобальные массивы и не формирует HTML.

Метод выражает намерение

GET читает и не меняет состояние. POST создаёт действие или запускает команду, PUT заменяет известное представление, PATCH изменяет часть, DELETE удаляет. Идемпотентность описывает эффект повтора, а не отсутствие тела.

Не завершайте тренировку ссылкой GET: браузер, crawler или prefetch способен перейти по ней без намерения пользователя. Изменение выполняется защищённой формой POST с CSRF-токеном либо API-командой с соответствующим механизмом авторизации.

Ответ говорит клиенту, что произошло

HTML-форма после успеха применяет Post/Redirect/Get. API создания возвращает 201 и адрес ресурса, ошибка формы — 422 с картой полей, конфликт версии — 409. 500 не раскрывает stack trace, но содержит correlation id для журнала.

Content-Type устанавливается явно. Не угадывайте желаемый формат только по расширению URL, если контракт использует Accept. Для одного небольшого сервиса допустимы раздельные маршруты /workouts и /api/workouts — важнее последовательность, чем архитектурная мода.

Минимальный front controller

<?php
declare(strict_types=1);

$request = Request::fromGlobals();
$response = $router->dispatch($request);

http_response_code($response->status);
foreach ($response->headers as $name => $value) {
    header($name . ': ' . $value);
}
echo $response->body;

Лабораторная работа

Опишите POST /workouts для создания тренировки. Перечислите поля, заголовки, успешный статус, ошибки формы, конфликт повтора и право текущего пользователя.

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

Проверка актуальности

  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
  • cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie