В JSF: Каков наилучший способ предотвратить фальсификацию формы?

Мы используем JSF 1.x с включенным сохранением состояния сервера. У нас есть проблема, когда злоумышленник, реализованный как веб-бот, может отправить страницу без отправки всех полей, которые, как ожидается, будут в форме. Это приводит к тому, что некоторые валидаторы не вызываются, которые должны быть вызваны, и т. Д.

Мы хотели бы запретить пользователям добавлять / удалять поля из формы и отправлять форму (если они хотят представить форму, в которой все ожидаемые поля больше всего присутствуют). Раньше я делал это с использованием hashа MD5 идентификаторов полей на странице плюс неизвестная фраза, сохраненная как скрытое поле на странице, и фильтр сеанса, который генерирует ожидаемый хеш с учетом идентификаторов полей, которые были отправлены, и сравнивает их с значение в скрытом поле.

Есть ли что-нибудь, что я могу сделать из коробки с JSF, чтобы пользователь не мог манипулировать формой? Или с сторонней библиотекой?

В JSF 1.x уже должно быть невозможно, если эти поля были заданы явно с required="true" . Если вы опустите это и / или замените с помощью специализированного валидатора или сделайте валидацию внутри метода действия bean-компонента, тогда боты действительно смогут изменить форму.

Поэтому, чтобы исправить это, добавьте явно required="true" к обязательным полям с жестким значением на стороне сервера (и, следовательно, не является required="#{not empty param.foo}" или так, где клиент / бот может управлять param.foo ). Поскольку состояние представления сохраняется на стороне сервера, веб-узел не может показать / изменить состояние.

По крайней мере, это теория. Или это должен быть очень умный webbot или, может быть, (старый?) Баг / эксплоит в JSF impl / version, используемом в вашем webapp. Здесь можно скачать последнюю версию JSF 1.x.


Обновление : для целевого ответа JSF 2.x голова в Validator пропускается при удалении ввода в клиенте – это соответствует спецификации JSF? В двух словах, это возможно в JSF 2.x, и это может (должно быть) быть защищено, поставив bean validation или DB-ограничения.