Один из самых старых уроков software security до сих пор остаётся одним из самых важных: никогда не доверяйте input только потому, что он пришёл через ваше собственное app.
Websites, APIs, admin panels и mobile apps получают input от пользователей, устройств, forms, files и других систем. Этот input может выглядеть нормальным в интерфейсе, но backend никогда не должен предполагать, что он безопасен, полон, корректно типизирован или честен.
Поэтому input validation всё ещё так важна. Многие серьёзные баги начинаются с того, что система принимает данные, которые должна была отклонить.
Простой пример из реальной жизни
Представьте, что checkout API ожидает:
- валидный product ID
- quantity больше нуля
- price, которая должна приходить с сервера
- delivery address в правильном формате
Теперь представьте, что developer слишком доверяет client-у. Frontend показывает варианты quantity только от 1 до 10, и backend предполагает, что пользователь не сможет отправить ничего другого.
Но атакующему не нужно использовать обычный интерфейс. Он может изменить request и отправить:
- quantity: -5
- quantity: 100000
- price: 0.01
- неожиданные fields, которых UI никогда не показывает
Если backend принимает эти значения без сильной validation, система может начать вести себя так, как продукт никогда не задумывал.
В этом и суть проблемы: интерфейсы направляют пользователя, но requests определяют реальность.
Почему input validation так важна
- Атакующие могут менять requests. Они не ограничены вашими form controls или app screens.
- Неожиданные значения ломают предположения. Отрицательные числа, огромные payloads, неверные форматы или странные states могут trigger-ить баги.
- Плохие данные могут присылать и другие системы. Не каждый опасный input исходит от злоумышленника. Integrations и automation тоже могут ошибаться.
- Validation защищает и security, и correctness. Она предотвращает abuse, но также уменьшает обычные product bugs.
Иными словами, validation нужна не только против атакующих. Она ещё и для того, чтобы система оставалась логически здоровой.
Типичные провалы validation
- доверие client-side checks, как будто их достаточно
- принятие fields, которые должны быть server-controlled
- разрешение values вне ожидаемых диапазонов
- отсутствие проверки object ownership или связанных entity IDs
- слишком слабая обработка files, URLs или HTML content
- предположение о type correctness только потому, что frontend typed
Во время разработки эти проблемы кажутся маленькими. В production они могут превратиться во fraud, corruption, broken logic или security incident.
Как выглядит хорошая validation
Для каждого важного input backend должен задавать такие вопросы:
- Это field обязательное?
- Type корректный?
- Format корректный?
- Value находится в допустимом диапазоне?
- Пользователю вообще разрешено задавать это field?
- Имеет ли это value смысл в текущем business state?
Вот что такое сильная validation. Это не просто проверка того, что payload “существует”. Это проверка того, имеет ли request смысл для системы.
Client-side validation полезна, но недостаточна
Client-side validation полезна для user experience. Она помогает пользователям быстро исправлять ошибки и избегать лишних failed requests.
Но client-side validation — не security boundary. Её можно bypass-нуть, убрать или переписать любым, кто контролирует client environment.
Поэтому безопасное правило простое: validate на client для usability, validate на server для доверия.
Скрытый урок: системы часто ломаются на краях
Многие developers тратят большую часть энергии на happy path: что должно происходить, когда пользователь ведёт себя нормально. Это нужно, но недостаточно.
Настоящее security thinking уделяет внимание краям:
- missing fields
- extra fields
- wrong types
- invalid state transitions
- unexpected combinations
- payloads, которые технически возможны, но логически неверны
Именно здесь часто и видно, система действительно robust или только визуально polished.
Опасное заблуждение
Распространённая мысль: “Frontend уже это предотвращает”.
Это делает системы хрупкими. Frontend может направлять поведение, но не контролирует, что реально доходит до backend. Если backend это не validate-ит, система доверяет тому, что на самом деле не контролирует.
Итог
Input validation важна потому, что системы должны принимать только те данные, которые разрешены, корректно оформлены и имеют смысл в контексте. Она защищает от атак, ложных предположений, сломанных workflows и скрытой corruption. Если website или mobile app принимает input, сильная backend validation — это не optional polish. Это часть реальной модели безопасности продукта.