5

当您使用 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,并使用安全约束来禁止访问这些文件,如: 如何避免用户访问 JSF 中的 .xhtml 页面?

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

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

4

1 回答 1

3

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

11.1.2 Servlet 映射

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

<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 映射。我建议使用*.xhtmlJSF 映射。这也为您提供了一个优势,即您不需要摆弄安全约束来防止直接访问源文件。


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

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

于 2011-06-14T11:08:19.817 回答