jsf网址映射安全风险

问题描述

| 使用JSF时,将具有控制器servlet javax.faces.webapp.FacesServlet,它将映射到以下内容
<servlet-mapping>
   ...
    <url-pattern>/somefacesurl/*</url-pattern>
</servlet-mapping>
将mypage.xhtml放在/中,存在安全风险,因为可以通过两种方式(从应用程序上下文开始)对其进行访问: 1)
/somefacesurl/mypage.xhtml
2)
/mypages.xhtml
一个是由jsf处理的,并且是正确的。 第二个未由jsf处理,因此呈现给客户端以公开jsf标签,这存在安全风险。 我只找到两种解决方案 1)始终映射到根网址:
<servlet-mapping>
   ...
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
好的解决方案,但仅允许按文件扩展名进行映射。 2)映射到任何url,并按照以下建议使用安全性约束禁止访问这些文件: 如何避免用户访问JSF中的.xhtml页面? 两种解决方案都在JSF 2.0规范中作为可行的替代方案提出,但是没有任何关于两种解决方案的不同安全性方法的消息。 由于未考虑安全性,所以我想知道从访问xhtml文件的角度来看第一个是否为“安全”,或者是否有破解方法获取.xhtml源代码。     

解决方法

        JSF规范要求第一个映射是不正确的。它仅给出了JSF 2.0规范的11.1.2章(您应该阅读)和JSF 1.2规范的10.1.2章中这两个映射的示例。这是JSF 2.0规范一的相关摘录(重点是我的):   11.1.2 Servlet映射      根据对网址格式的匹配(如在   Java Servlet规范)中选择该网站的上下文路径之后的请求URL部分   应用。 JSF实现必须支持定义“ 4”的Web应用程序   将任何有效的ѭ5映射到ѭ6。可以使用前缀或扩展名映射。什么时候   使用前缀映射,建议但不要求以下映射:      
<servlet-mapping>
    <servlet-name> faces-servlet-name </servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
     使用扩展映射时,建议但不要求以下映射:      
<servlet-mapping>
    <servlet-name> faces-servlet-name </servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>
     除了“ 6”之外,JSF实现可能支持其他方式来调用JavaServer Faces请求   处理生命周期,但是依赖于这些机制的应用程序将无法移植。 我真的不明白为什么扩展名(后缀)映射是“ tricky”。更重要的是,这是我最喜欢的JSF映射。我建议将“ 10”用作JSF映射。这也给您带来的好处是,您无需摆弄安全性约束即可防止直接访问源文件。 更新:请注意,只要视图是声明性的并且不包含任何一行Java源代码(其中存储和公开了数据库用户名/密码之类的变量)的Java源代码,源泄漏本身就不是安全问题。由于Facelets不允许嵌入原始Java代码(例如JSP scriptlets),因此我看不到这是一种安全漏洞。黑客可以使用视图源做什么?编辑,渲染并以某种方式提交回来? (我真的很想知道如何)。这显然是不可能的,因为默认情况下,JSF也依赖于服务器端的视图状态。 但是,我同意JSF规范应该向读者提供更多有关这一点的观点。我为此创建了JSF规范问题1015。