我们正在使用JSF 1.x打开服务器端状态保存.我们遇到一个问题,即作为web-bot实现的恶意用户可以提交页面,而不提交预期在表单中的所有字段.这导致一些未被调用的验证器应被调用,等等.
我们希望阻止用户能够在表单中添加/删除字段并提交表单(如果他们想要提交表单,则所有预期字段都在那里).在过去,我使用页面上字段ID的MD5哈希加上在页面上保存为隐藏字段的未知短语和会话过滤器,在给定提交的字段ID的情况下生成预期哈希并将其与隐藏字段中的值.
有什么我可以用JSF开箱即用,以防止用户操纵表单?或者使用第三方库?
在JSF中,如果明确设置了这些字段,那么应该已经不可能了required="true"
.如果省略这个和/或替换自定义验证器或者在bean操作方法中进行验证,那么机器人确实能够篡改表单.
因此,为了解决这个问题,请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中实现,并且可以(应该)通过放置bean验证或DB约束来保护它.