微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止 JSF 2.2 接受来自不同会话的 ViewState?

如何解决如何防止 JSF 2.2 接受来自不同会话的 ViewState?

我使用的是 JSF 2.2(Glassfish 4.1)。我们的 web 应用程序有 Primefaces 6.0 和 Omnifaces 2.6.9 作为依赖项。 JSF 状态存储在服务器上。 举个例子,我有这个表单,其中 usermodel一个 javax.faces.view.ViewScoped bean。

<h:form id="user">
    <p:inputText id="name" value="#{usermodel.name}"/>
    <p:inputText id="pass" value="#{usermodel.pass}"/>
    <p:commandButton id="create" value="#{msgs.lbl_add}" action="#{usermodel.addUser()}"/>
</h:form>

一家公司扫描了我们的网络应用是否存在安全问题,并声称其存在 CSRF 漏洞。攻击者可以像这样向我们的一个应用用户提供一个虚构的表单来执行不需要的操作。

<!DOCTYPE html>
<html>
    <body>
        <form action="http://appserver:8080/myapp/users.jsf" method="POST">
            <input type="hidden" name="javax.faces.source" value="user:create"/>
            <input type="hidden" name="user:create" value="user:create"/>
            <input type="hidden" name="user" value="user"/>
            <div>
                <input type="text" name="user:name" value="FAKEUSER"/>
                <input type="text" name="user:pass" value="FAKEPASSWORD"/>
                <input type="text" name="javax.faces.ViewState" value="1185295409278172717:-3206872038807094332"/>
            </div>
            <input type="submit" name="submit" value="Create User"/>
        </form>
    </body>
</html>

我在 SO 上读到 ViewState 是防止 CSRF 的 JSF 方式。但是在我们的网络应用程序中可能会出现以下场景(如果重要的话,使用 HTTP 协议)。

  1. 攻击者访问我们的应用登录页面以在其页面源中找到有效的 ViewState。
  2. 攻击者使用他的 ViewState 准备上述 HTML 文件并发送给受害者。
  3. 受害者在浏览器中打开 HTML 文件并提交(来自本地文件系统,例如 file:///C:/... 或由本地网络服务器托管)
  4. 用户已创建。

结论是我们这个场景中的webapp/JSF并没有检查接收到的ViewState是否属于JSESSIONID标识的会话。

这不是漏洞吗?我怎样才能避免这种情况?

解决方法

在我们的例子中,这是我们应用程序中的一个错误。我们还使用了 Deltaspike 库并在我们的应用中注册了一个“处理所有异常”类。

import org.apache.deltaspike.core.api.exception.control.ExceptionHandler;
import org.apache.deltaspike.core.api.exception.control.Handles;
import org.apache.deltaspike.core.api.exception.control.event.ExceptionEvent;

@ExceptionHandler
public class ExceptionDispatcher {

    public void processException(@Handles ExceptionEvent<Throwable> evt) {
        // Handle exception by just logging
    }
}

这也“处理”了 javax.faces.application.ViewExpiredException,如果 JSF 发现无效的 ViewState,则会发生这种情况。结果,请求被正常处理。

更好的实现将重定向到错误页面并使会话无效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?