我们正在使用JSF 1.x打开服务器端状态保存。我们遇到一个问题,即作为web-bot实现的恶意用户可以提交页面,而不提交预期在表单中的所有字段。这导致一些未被调用的验证器应被调用,等等。
我们希望阻止用户在表单中添加/删除字段并提交表单(如果他们想要提交表单,那么所有预期字段都会在那里提交)。在过去,我使用页面上字段ID的MD5哈希加上在页面上保存为隐藏字段的未知短语和会话过滤器,在给定提交的字段ID的情况下生成预期哈希并将其与隐藏字段中的值。
我可以用JSF开箱即可防止用户操作表单吗?或者使用第三方库?
答案 0 :(得分:5)
如果使用required="true"
明确设置了这些字段,那么JSF 1.x应该已经不可能了。如果你省略了这个和/或用自定义验证器替换或者在bean操作方法中进行验证,那么机器人确实能够篡改表单。
为了解决这个问题,请将required="true"
显式添加到具有硬服务器端值的必填字段(因此不是required="#{not empty param.foo}"
左右,客户端/机器人可以控制param.foo
})。由于视图状态存储在服务器端,因此webbot无法显示/修改状态。
至少,这就是理论。或者它必须是一个非常智能的webbot,或者可能是你的webapp中使用的JSF impl /版本中的(旧的?)bug / exploit。最新的JSF 1.x可以下载here。
更新:对于JSF 2.x目标答案,前往Validator skipped when input is removed in client – is this as per JSF specification?简而言之,它可以在JSF 2.x中实现,并且可以(应该)保护通过放置bean验证或DB约束。