Валидация идёт слоями
Сначала проверяется наличие и форма: строка, дата ISO, целое число. Затем значение преобразуется в тип. После этого предметное правило решает, допустима ли дата для пользователя и не конфликтует ли тренировка с уже опубликованной записью.
Одна ошибка поля не должна стирать остальные результаты. Карта errors связывает имя поля с кодом и пользовательским сообщением, а общая ошибка формы сообщает о конфликте, который нельзя отнести к одному input.
Цикл формы
Повторный показ без 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Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .