在JSF中,防止表单篡改的最佳方法是什么?

我们正在使用JSF 1.x打开服务器端状态保存。 我们遇到一个问题,即作为web-bot实施的恶意用户可以提交页面,而不提交预期在表单中的所有字段。 这导致一些未被调用的validation器应被调用,等等。

我们希望阻止用户在表单中添加/删除字段并提交表单(如果他们想要提交表单,那么所有预期字段都在那里)。 在过去,我使用页面上字段ID的MD5哈希加上在页面上保存为隐藏字段的未知短语和会话filter,根据提交的字段ID生成预期哈希并将其与隐藏字段中的值。

有没有什么我可以用JSF开箱即用,以防止用户操纵表单? 或者使用第三方库?

在JSF中,如果使用required="true"明确设置了这些字段,则应该已经不可能了。 如果省略这个和/或替换自定义validation器或者在bean操作方法中进行validation,那么机器人确实能够篡改表单。

因此,要解决此问题,请将显式required="true"添加到具有硬服务器端值的必填字段(因此不需要例如required="#{not empty param.foo}"或者客户端/机器人可以控制param.foo )。 由于视图状态存储在服务器端,因此webbot无法显示/修改状态。

至少,这就是理论。 或者它必须是一个非常智能的webbot或者你的webapp中使用的JSF impl /版本中的(旧的?)bug / exploit。 最新的JSF 1.x可以在这里下载。


更新 :对于JSF 2.x目标答案, 在客户端删除输入时跳转到Validator – 这是否符合JSF规范? 简而言之,它可以在JSF 2.x中实现,并且可以(应该)通过放置beanvalidation或数据库约束来保护它。