Самоучитель: динамические веб-приложения
Глава 6 из 18III. Серверное веб-приложение95 минут

Глава 6. Шаблоны, формы и загрузки как разные границы

Форма — это внешний протокол: сервер проверяет каждый ожидаемый ключ, а шаблон только отображает подготовленную модель представления.

После главы вы сможете
  • экранировать по контексту
  • проектировать форму как контракт
  • безопасно принимать файл

Шаблон не должен принимать решения

Контроллер подготавливает view model: строки, флаги доступности и уже выбранные безопасные URL. Шаблон отвечает за разметку и минимальные условия показа. SQL, чтение $_POST и проверка прав внутри шаблона превращают вывод в непроверяемый второй контроллер.

Автоматическое экранирование шаблонизатора полезно, но разработчик всё равно различает текст узла, атрибут, URL, JavaScript и CSS. Одна функция escape не подходит всем контекстам.

Контракт формы

Составьте allowlist полей и ограничения до чтения запроса. Отсутствующее поле отличается от пустого, массив вместо строки — отдельная ошибка формы, а нормализация пробелов не должна незаметно менять пароль. Клиентские атрибуты required и pattern помогают пользователю, но любой запрос можно собрать без браузера.

Ошибки возвращайте рядом с полями и общей сводкой, сохраняя безопасные значения. Пароль, CSRF-токен и загруженный файл повторно не подставляются.

PRG и повтор команды

Post/Redirect/GetРедирект отделяет изменение состояния от последующего отображения и уменьшает риск повторной отправки формы.POSTпроверкаКомандаизменение303LocationGETрезультат
Редирект отделяет изменение состояния от последующего отображения и уменьшает риск повторной отправки формы.

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

Для cookie-сеанса браузер автоматически прикладывает идентификатор, поэтому сторонний сайт способен инициировать запрос. Синхронный CSRF-токен связывает форму с серверным сеансом и проверяется через hash_equals. SameSite cookie добавляет защитный слой, но не заменяет токен во всех сценариях.

Токен не помещают в URL и не пишут в аналитику. Ошибка токена завершает сценарий до предметного изменения.

Загрузка файла

Имя, MIME и расширение от клиента недостоверны. Сервер проверяет ошибку загрузки, размер, фактический формат разрешённым декодером и назначает собственное случайное имя. Файлы хранятся вне публичного каталога либо отдаются через контролируемый обработчик с безопасными заголовками.

Не передавайте путь пользователя в include, require или shell. Для изображений повторное декодирование может уменьшить риск вредоносного содержимого, но лимиты размеров и ресурсов нужны до дорогой обработки.

Сообщение и журнал

Пользователь должен понять, какое действие возможно дальше, но ему не нужны путь сервера, SQL или stack trace. Закрытый журнал сохраняет correlation id, тип ошибки, маршрут и безопасные идентификаторы. Полный набор формы почти никогда не должен попадать в лог.

Если исключение возникло после частичной записи, сначала восстановите согласованность транзакцией или компенсирующей операцией, затем формируйте ответ.

Практика главы

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

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

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

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

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

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

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

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

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

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

Аналитика

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

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

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

Политики

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