Шаблон не должен принимать решения
Контроллер подготавливает view model: строки, флаги доступности и уже выбранные безопасные URL. Шаблон отвечает за разметку и минимальные условия показа. SQL, чтение $_POST и проверка прав внутри шаблона превращают вывод в непроверяемый второй контроллер.
Автоматическое экранирование шаблонизатора полезно, но разработчик всё равно различает текст узла, атрибут, URL, JavaScript и CSS. Одна функция escape не подходит всем контекстам.
Контракт формы
Составьте allowlist полей и ограничения до чтения запроса. Отсутствующее поле отличается от пустого, массив вместо строки — отдельная ошибка формы, а нормализация пробелов не должна незаметно менять пароль. Клиентские атрибуты required и pattern помогают пользователю, но любой запрос можно собрать без браузера.
Ошибки возвращайте рядом с полями и общей сводкой, сохраняя безопасные значения. Пароль, CSRF-токен и загруженный файл повторно не подставляются.
PRG и повтор команды
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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .