带有 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&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
中拥有修改后的副本,但要独立于实现,您必须完全重新实现 ViewHandlerImpl
或 ExternalContextImpl
并将其作为自定义副本提供,但这是很多工作。
但是,由于您已经在使用<f:viewParam>
,您也可以只使用<form>
代替<h:form>
和<input type="submit">
代替<h:commandButton>
:
<form>
<h:inputText id="searchName" value="#nbsearchpage.searchName" />
<input type="submit" value="search" />
</form>
并改为在预渲染视图事件侦听器中执行操作方法。这也是在 JSF 中使用 GET 表单的更正确方法,因为 <h:form>
仅用于 POST。
与具体问题无关:
我的视图范围也有同样的问题,无法在重定向中存活,为此我必须创建一个自己的范围。
幸存的重定向从来没有是视图范围的意图。只要您与同一个视图交互(尤其是通过 Ajax 和有条件地重新呈现内容),视图范围就会一直存在。您基本上是在寻找对话范围。你应该看过 CDI 的 @ConversationScoped
或 MyFaces CODI。
【讨论】:
以上是关于带有 includeViewParams 的 JSF2 重定向允许用户输入解析为文本字段的 EL 表达式的主要内容,如果未能解决你的问题,请参考以下文章
带有 require.js 的 Knockout.js 映射插件
带有stickit.js的backbone.js嵌套对象属性
带有 knockout.js 和 ORM 的 TypeScript