jsf url-mapping安全风险

时间:2011-06-14 09:07:39

标签: jsf netbeans security url-mapping

使用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)始终映射到根URL:

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

良好的解决方案,但只允许通过文件扩展名进行映射。

2)映射到任何URL,并使用安全约束禁止访问这些文件,如下所示: How to avoid user access to .xhtml page in JSF?

两种解决方案都作为可行的替代方案在JSF 2.0规范中提出,但是没有关于这两种解决方案的不同安全方法的说法。

由于不考虑安全性,我想知道从访问xhtml文件的角度来看第一个是“安全的”还是有一个黑客来获取.xhtml源。

1 个答案:

答案 0 :(得分:3)

JSF规范要求第一个映射是不正确的。它只是给出了JSF 2.0规范(您应该阅读)的第11.1.2章和JSF 1.2规范的第10.1.2节中的两个映射的示例。这是JSF 2.0规范的一个相关摘录(强调我的):

  

11.1.2 Servlet映射

     

基于匹配URL模式(如。中所定义),对Web应用程序的所有请求都映射到特定的servlet    Java Servlet规范)针对选择此Web的上下文路径之后的请求URL部分   应用。 JSF实现必须支持定义<servlet-mapping>的Web应用程序   将任何有效的url-pattern映射到FacesServlet可以使用前缀或扩展名映射。何时   使用前缀映射时,建议使用以下映射,但不是必需的:

     
<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>
     

除了FacesServlet之外,JSF实现还可以支持其他方式来调用JavaServer Faces请求   处理生命周期,但依赖这些机制的应用程序将无法移植。

我真的不明白为什么扩展(后缀)映射是“棘手的”。更重要的是,这是我最喜欢的JSF映射。我建议使用*.xhtml作为JSF映射。这也为您提供了一个优势,即您无需调整安全约束来阻止直接访问源文件。


更新:请注意,只要视图是声明性的,并且不包含任何单行的Java源代码(其中包含数据库用户名/密码等变量),源泄漏本身就不是安全问题存储和暴露。由于Facelets不允许使用嵌入式原始Java代码(如JSP scriptlet),因此我不知道这是一个安全漏洞。黑客可以对视图源做些什么?编辑它,渲染它并以某种方式提交回来? (我真的很想知道如何)。这是不可能的,因为默认情况下JSF也依赖于服务器端的视图状态。

然而,我同意JSF规范应该告诉读者更多关于这一点的观点。我为此创建了JSF spec issue 1015