【问题标题】:In JSF, What is the best way to prevent Form tampering?在 JSF 中,防止表单篡改的最佳方法是什么?
【发布时间】:2010-02-01 16:27:21
【问题描述】:

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

我们希望防止用户能够从表单中添加/删除字段并提交表单(如果他们想要提交表单,所有预期的字段大部分都在那里)。过去,我使用页面上的字段 id 的 MD5 哈希值以及在页面上保存为隐藏字段的未知短语和会话过滤器来完成此操作,该过滤器在给定提交的字段 id 的情况下生成预期的哈希值并将其与隐藏字段中的值。

我可以用 JSF 开箱即用地做些什么来防止用户操作表单吗?还是使用第三方库?

【问题讨论】:

    标签: java model-view-controller jsf


    【解决方案1】:

    如果这些字段是用required="true" 显式设置的,那么在 JSF 1.x 中应该已经不可能了。如果您省略此和/或替换为自定义验证器或在 bean 操作方法中进行验证,那么机器人确实能够篡改表单。

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

    至少,理论上是这样的。或者它必须是一个非常聪明的网络机器人,或者可能是你的 web 应用程序中使用的 JSF impl/version 中的一个(旧的?)错误/漏洞。最新的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 约束。

    【讨论】:

    • Crud——我刚刚从开发人员那里得知他正在使用客户端状态保存。他正在将其更改为服务器端,以查看是否可以修复它。就像你说的,人们希望它会。
    • 就我个人而言,如果机器人已经可以解码视图状态,修改它并编码回来,它已经非常聪明了。这也是开发人员的大量工作。有问题的网站一定是值得的:)
    • 切换到表单至少有一个必填字段的会话状态保存就可以了。谢谢!
    • 我知道这个线程有点老了,但我在 JSF 2.0 中尝试过,只是从元素检查器(F12 chrome)中删除所需的输入文本,它确实提交了一个空值。 JSF 有没有办法验证这种表单篡改?
    • @Joshua:我通过引用 JSF 2.x 目标问答更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2012-09-11
    • 2013-03-25
    • 2016-12-19
    • 2011-09-15
    相关资源
    最近更新 更多