Hidden Form Field Manipulation в SPA и старых веб-приложениях
Если форма на сайте выглядит безобидно, это не значит, что она безопасна. Один из примеров — скрытые поля форм (hidden form fields), которые могут хранить важные значения: цену товара, идентификатор пользователя, уровень доступа. Когда такие поля не защищены, злоумышленник может легко изменить их и отправить на сервер уже подменённые данные. Этот метод известен как Hidden Form Field Manipulation.
Сегодня, в мире SPA (Single Page Applications) и «классических» серверных приложений, эта проблема проявляется по-разному, но суть уязвимости неизменна: клиенту доверяют слишком много.
Что такое Hidden Form Field Manipulation
В HTML-формах можно встретить элемент <input type="hidden">
. Он не отображается в интерфейсе, но отправляется на сервер при сабмите формы. Разработчики используют его, чтобы передавать вспомогательные данные между страницами без участия пользователя.
Пример простого скрытого поля:
<form method="POST" action="/buy">
<input type="hidden" name="price" value="100">
<input type="submit" value="Купить">
</form>
Проблема в том, что пользователь может легко изменить значение этого поля через инструменты разработчика в браузере. Например, вместо 100 поставить 1 и купить товар почти бесплатно.
Почему уязвимость актуальна и сегодня
Можно подумать, что этот трюк из «старой школы» хакерства давно не работает, но практика показывает обратное. В реальных пентестах скрытые поля до сих пор содержат критически важные данные. Причин несколько:
- Быстрая разработка и копирование старого кода без проверки безопасности.
- Миграция старых форм в SPA без пересмотра архитектуры.
- Доверие к клиенту из-за иллюзии «защищенности» JavaScript-кода.
- Отсутствие серверной валидации.
SPA-фреймворки (React, Angular, Vue) тоже не защищают от этой уязвимости, если логика проверки остается только на фронтенде. Данные в HTML или в сетевых запросах можно перехватить и изменить.
Как атакуют скрытые поля
Сценарий атаки обычно выглядит так:
- Открыть страницу с формой и найти скрытые поля через DevTools.
- Изменить значение прямо в DOM или через JavaScript в консоли.
- Отправить форму с измененными данными.
- Если сервер не проверяет значения — атака успешна.
Кроме ручного изменения, злоумышленник может автоматизировать процесс через Postman , cURL или прокси типа Burp Suite .
Пример атаки на SPA
В SPA скрытое поле может находиться в динамически отрисованной форме. Например, кнопка «Купить» вызывает POST-запрос с данными:
{
"productId": 123,
"price": 100
}
Если цена берется из скрытого поля на фронтенде, её можно заменить и отправить запрос вручную, минуя UI.
Риски для бизнеса
Hidden Form Field Manipulation может привести к:
- Финансовым потерям (изменение цены, скидок, налогов).
- Обходу ограничений (например, изменение уровня доступа).
- Подмене параметров транзакций.
- Раскрытию внутренних идентификаторов и бизнес-логики.
В некоторых случаях такая атака используется как элемент цепочки для более сложного взлома: от подделки запросов до эксплуатации логических уязвимостей.
Как защититься
Главный принцип — не доверяйте данным с клиента. Всё, что приходит от пользователя (включая скрытые поля), должно считаться потенциально измененным.
Серверная валидация
- Все критически важные значения (цены, роли, лимиты) храните и проверяйте на сервере.
- Сравнивайте присланные значения с данными из базы.
- Не полагайтесь на скрытые поля как на «источник правды».
Подпись данных
Если по архитектуре нужно передать важные параметры через форму, их можно подписывать на сервере и проверять подпись при получении.
price=100&hash=5d41402abc4b2a76b9719d911017c592
Хэш или подпись должен вычисляться на основе секретного ключа, недоступного клиенту.
Использование токенов
Для защиты от CSRF и подмены параметров применяйте одноразовые токены, которые действуют только для одной операции.
Отказ от критичных скрытых полей
В современных приложениях нет необходимости хранить цену или уровень доступа в скрытых полях. Лучше запрашивать эти данные на сервере при отправке формы.
Проверка приложения на уязвимость
Проверить свои формы можно вручную или с помощью инструментов:
- OWASP ZAP
- Burp Suite
- Встроенные инструменты разработчика в браузере
Алгоритм проверки:
- Найти все формы с
type="hidden"
. - Изменить значения и отправить форму.
- Посмотреть реакцию сервера.
Заключение
Hidden Form Field Manipulation — пример того, как «мелочь» может стоить больших денег. В SPA уязвимость часто маскируется под «безопасную» передачу данных через API, а в старых приложениях она может тянуться годами. Решение одно — жёстко проверять все входящие данные на сервере и проектировать логику так, чтобы критичные значения никогда не зависели от клиента.