В JSF, как лучше всего предотвратить подделку форм?
Мы используем JSF 1.x с включенным сохранением состояния на стороне сервера. У нас есть проблема, когда злонамеренный пользователь, реализованный как веб-бот, может отправить страницу без отправки всех полей, которые должны быть в форме. Это приводит к тому, что некоторые валидаторы не вызывают, которые должны вызываться и т. Д.
Мы хотели бы запретить пользователям возможность добавлять / удалять поля из формы и отправлять форму (если они хотят отправить форму, все ожидаемые поля больше всего там). В прошлом я делал это, используя MD5-хэш идентификаторов полей на странице плюс неизвестную фразу, сохраненную как скрытое поле на странице, и фильтр сеанса, который генерирует ожидаемый хэш с учетом отправленных идентификаторов полей и сравнивает их с значение в скрытом поле.
Есть ли что-нибудь, что я могу сделать из коробки с JSF, чтобы пользователь не мог манипулировать формой? Или со сторонней библиотекой?
1 ответ
В JSF 1.x уже не должно быть возможности, если эти поля были установлены явно с required="true"
, Если вы пропустите это и / или замените его с помощью специального валидатора или выполните проверку внутри метода действия bean-компонента, тогда боты действительно смогут изменить форму.
Чтобы исправить это, добавьте явно required="true"
в обязательные поля с жестким значением на стороне сервера (и, следовательно, не, например, required="#{not empty param.foo}"
или так, где клиент / бот может контролировать param.foo
). Поскольку состояние просмотра хранится на стороне сервера, веб-бот не может раскрыть / изменить состояние.
По крайней мере, это теория. Или это должен быть очень умный веб-бот или, возможно, (старая?) Ошибка / эксплойт в impl / версии JSF, используемой в вашем веб-приложении. Последнюю версию JSF 1.x можно скачать здесь.
Обновление: для целевого ответа JSF 2.x голова к Validator пропускается при удалении ввода в клиенте - это согласно спецификации JSF? В двух словах, это возможно в JSF 2.x, и это можно (как предполагается) защитить, установив проверку bean-компонентов или ограничения DB.