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

时间:2010-02-01 16:27:21

标签: java model-view-controller jsf

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

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

我可以用JSF开箱即可防止用户操作表单吗?或者使用第三方库?

1 个答案:

答案 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约束。