带有 includeViewParams 的 JSF2 重定向允许用户输入解析为文本字段的 EL 表达式

Posted

技术标签:

【中文标题】带有 includeViewParams 的 JSF2 重定向允许用户输入解析为文本字段的 EL 表达式【英文标题】:JSF2 redirect with includeViewParams allows users to enter EL expression which are resolved into text fields 【发布时间】:2011-12-31 03:54:03 【问题描述】:

我有一个 JSF2 Xhtml 页面,它定义了视图参数,这允许一个人拥有可收藏的 URL。 XHTML 页面包含以下参数:

<f:metadata>
  <f:viewParam name="searchName" value="#nbsearchpage.searchName" />
  <!-- More view parameters omitted here for brevity -->
  <f:event listener="#nbsearchpage.searchPreRender" type="javax.faces.event.PreRenderViewEvent" />
</f:metadata>

在同一页面上,我有一个文本字段和一个允许用户更改搜索名称的按钮:

<h:form id="some-id">
  <h:inputText value="#nbsearchpage.searchName" />
  <h:commandButton value="search" action="#nbsearchpage.search" />
</h:form>

最后,nbsearchpage bean 中的 action 方法 search() 返回到同一页面,但包含参数:

?faces-redirect=true&amp;includeViewParams=true

它为用户提供了一个不错的 URL。当用户在搜索字段中输入“IBM”时,URL 被重定向到

?searchName=IBM 

效果很好。但是现在用户可以在 searchName 文本字段中输入一个 EL 表达式,并计算 EL 表达式。例如。当用户在文本字段中输入“#2+2”时,URL 被重定向到

?searchName=4

这是我认为我们不应该做的,出于安全原因允许用户输入 EL 表达式。我正在使用 Glassfish 3.1.1。

任何想法如何防止这种自动 EL 解析?我认为 JSF2 中的视图参数概念和重定向存在根本缺陷?我对无法在重定向中幸存的视图范围有同样的问题,为此我必须创建一个自己的范围。 (我本可以使用闪光范围)。

【问题讨论】:

我可以用 Mojarra 2.1.2 重现这一点,这是一个严重的安全漏洞,因为它还允许访问会话属性和调用任意方法。 【参考方案1】:

此问题已在 MYFACES-3405(MyFaces Core 版本 2.0.11、2.1.5)和 JAVASERVERFACES-2247(Mojarra 版本 2.0.7、2.1.5、2.1.6)中得到解决。

只需使用更新版本。

【讨论】:

【参考方案2】:

我可以在 Mojarra 2.1.4 上重现这个。这绝对是不可取的。我已经以issue 2247 的形式向 Mojarra 的人报告了它(如果可以的话,投给它)。顺便说一下,MyFaces 2.1.3 也暴露了同样的问题。

只要根本原因在于 JSF 实现特定的实用程序类,就没有想到此特定问题的简单解决方法。您可以轻松地在 /WEB-INF/classes 中拥有修改后的副本,但要独立于实现,您必须完全重新实现 ViewHandlerImplExternalContextImpl 并将其作为自定义副本提供,但这是很多工作。

但是,由于您已经在使用&lt;f:viewParam&gt;,您也可以只使用&lt;form&gt; 代替&lt;h:form&gt;&lt;input type="submit"&gt; 代替&lt;h:commandButton&gt;

<form>
  <h:inputText id="searchName" value="#nbsearchpage.searchName" />
  <input type="submit" value="search" />
</form>

并改为在预渲染视图事件侦听器中执行操作方法。这也是在 JSF 中使用 GET 表单的更正确方法,因为 &lt;h:form&gt; 仅用于 POST。


与具体问题无关

我的视图范围也有同样的问题,无法在重定向中存活,为此我必须创建一个自己的范围。

幸存的重定向从来没有是视图范围的意图。只要您与同一个视图交互(尤其是通过 Ajax 和有条件地重新呈现内容),视图范围就会一直存在。您基本上是在寻找对话范围。你应该看过 CDI 的 @ConversationScoped 或 MyFaces CODI。

【讨论】:

以上是关于带有 includeViewParams 的 JSF2 重定向允许用户输入解析为文本字段的 EL 表达式的主要内容,如果未能解决你的问题,请参考以下文章

带有 require.js 的 Knockout.js 映射插件

带有stickit.js的backbone.js嵌套对象属性

带有 knockout.js 和 ORM 的 TypeScript

带有文本框和 JS 的提交按钮

带有 init.js 的 Sharepoint 2010 包

带有express和socket.io的节点js-找不到socket.io.js