在操作CSRF令牌</protected-views>后仍可访问<protected-views>中声明的视图

时间:2015-03-17 16:30:47

标签: jsf facelets jsf-2.2 protected-views

我正在探索JSF 2.2中的新功能(到目前为止非常酷),但我仍然不了解受保护的视图是如何工作的,我创建了一个带有facelet2链接的facelet1,如下所示:

<h:link styleClass="link" value="Go to protected page" id="link1"
    outcome="/protected/facelet2.xhtml"></h:link>

在我的faces-config.xml中我添加了这个:

<protected-views>
    <url-pattern>/protected/facelet2.xhtml</url-pattern>
</protected-views>

现在,当我运行页面时,会在网址中添加一个标记:

http://localhost:8080/<project>/protected/facelet2.faces?javax.faces.Token=1426608965211

根据文档,如果令牌与服务器中的令牌不匹配,则不处理GET请求(我的理解是否正确?)。

但是如果我修改令牌(使用Firebug或浏览器中包含的开发工具),即使令牌被修改,仍然会处理请求。

我做错了吗?

1 个答案:

答案 0 :(得分:5)

这是因为FacesServlet显然映射到*.faces的JSF 1.0样式的URL模式而不是*.xhtml的JSF 2.0样式的URL模式。 <protected-views><url-pattern>必须与浏览器地址栏中显示的实际网址格式匹配。

因此,如果实际网址为/protected/facelet2.faces,则需要按以下方式对其进行配置:

<protected-views>
    <url-pattern>/protected/facelet2.faces</url-pattern>
</protected-views>

然而,在此期间,我在当前的Mojarra 2.2.10实施中发现了一些令人讨厌的问题:

  1. 根据Servlet 12.1规范(there's even a vague comment in source code indicating that!)确实没有做前缀/后缀匹配。它只是一个完全匹配。这意味着,您无法使用/protected/*等通配符网址模式。

  2. 生成<h:link>时,它不会将受保护的视图URL模式与已解析的URL进行比较,而是将其与JSF视图ID进行比较。并且,在检查传入请求时,它不会将请求URL与JSF视图ID(如链接生成期间)进行比较,而是与<url-pattern>进行比较。因此,这永远不会匹配,完全解释了为什么你可以在没有有效令牌的情况下简单地访问它。

  3. 基本上,如果需要保留JSF 1.0样式的URL模式*.faces,则需要以下配置。

    <protected-views>
        <url-pattern>/protected/facelet2.xhtml</url-pattern>
        <url-pattern>/protected/facelet2.faces</url-pattern>
    </protected-views>
    

    然后在没有有效令牌的情况下访问时正确抛出javax.faces.application.ProtectedViewException。更好的方法是在FacesServlet *.xhtml上明确地web.xml {}显示{。}}。

    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    

    这样您就不需要处理虚拟URL。

    我已经向Mojarra的家伙报告issue 3837

    另见: