jsf url-mapping安全风险

Ago*_*noX 5 security jsf netbeans url-mapping

当您使用JSF时,您将拥有将映射到以下内容的控制器servlet javax.faces.webapp.FacesServlet:

<servlet-mapping>
   ...
    <url-pattern>/somefacesurl/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

在/中放置mypage.xhtml,我们存在安全风险,因为它将以两种方式访问​​(从应用程序上下文开始):1)/somefacesurl/mypage.xhtml 2)/mypages.xhtml

第一个是由jsf处理的,是正确的. 第二个不是由jsf处理的,因此提供给客户端暴露jsf标签,这是一个安全风险.

我发现只有两个解决方案
1)始终映射到根URL:

<servlet-mapping>
   ...
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

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

2)映射到任何URL,并使用安全约束禁止访问这些文件,如下所述: 如何避免用户访问JSF中的.xhtml页面?

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

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

Bal*_*usC 3

JSF 规范强制要求第一个映射是不正确的。它仅提供了 JSF 2.0 规范的第 11.1.2 章(您应该阅读)和 JSF 1.2 规范的第 10.1.2 章中的两个映射的示例。以下是 JSF 2.0 规范一的相关摘录(重点是我的):

11.1.2 Servlet 映射

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

<servlet-mapping>
    <servlet-name> faces-servlet-name </servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

使用扩展映射时,建议使用以下映射,但不是必需的:

<servlet-mapping>
    <servlet-name> faces-servlet-name </servlet-name>
    <url-pattern>*.faces</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

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

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


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

不过,我同意 JSF 规范应该向读者提供更多有关这一点的信息。我为此创建了JSF 规范问题 1015 。