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

Глава 10. Формы, карта ошибок и Post/Redirect/Get

Хорошая форма не просто отклоняет запрос: она сохраняет допустимый ввод, показывает точную причину рядом с полем и не повторяет изменение при обновлении страницы.

После главы вы сможете
  • развести синтаксис и предметное правило
  • построить карту ошибок
  • закрыть повтор POST

Валидация идёт слоями

Сначала проверяется наличие и форма: строка, дата ISO, целое число. Затем значение преобразуется в тип. После этого предметное правило решает, допустима ли дата для пользователя и не конфликтует ли тренировка с уже опубликованной записью.

Одна ошибка поля не должна стирать остальные результаты. Карта errors связывает имя поля с кодом и пользовательским сообщением, а общая ошибка формы сообщает о конфликте, который нельзя отнести к одному input.

Цикл формы

Безопасная обработка формыПри ошибке отображается тот же POST-результат, при успехе браузер получает redirect и больше не держит изменяющий запрос.GETempty formPOSTraw fieldsValidateerror mapExecuteuse caseRedirectflash
При ошибке отображается тот же POST-результат, при успехе браузер получает redirect и больше не держит изменяющий запрос.

Повторный показ без XSS

Возвращайте в value исходное допустимое текстовое представление, экранированное для HTML-атрибута. Пароли, CSRF-токены и загруженные файлы не восстанавливаются как обычные значения. Select и checkbox получают состояние из нормализованной модели формы.

Сообщение должно подсказывать исправление: «укажите целое число от 1 до 500», а не «неверно». Но не раскрывайте, существует ли email, если это облегчает перечисление учётных записей.

PRG и flash

После успешной команды сервер отвечает 303 See Other на страницу результата. Короткое flash-сообщение хранится в сессии до следующего чтения. При обновлении браузер повторяет безопасный GET, а не создание записи.

PRG не делает операцию идемпотентной при потере ответа: клиент способен повторить POST до получения redirect. Для критичной команды добавьте idempotency key или уникальный предметный ключ в базе.

CSRF — проверка намерения

Токен привязан к пользовательской сессии, имеет достаточную энтропию и проверяется constant-time сравнением. SameSite cookie снижает часть риска, но не заменяет токен во всех сценариях. XSS способен обойти многие CSRF-защиты, поэтому контекстное экранирование остаётся обязательным.

Не помещайте токен в URL: он попадёт в историю, Referer и журналы. Для JSON API архитектура защиты зависит от способа аутентификации; cookie-сессия всё ещё требует учитывать CSRF.

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

Создайте форму добавления подхода с полями exercise, weight_kg и repetitions. Верните карту ошибок, сохраните корректные значения и примените 303 после успешной записи.

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

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

Отметка, заметка, чек-лист и ответы остаются в 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