13

我有一个定义视图参数的 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>

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

<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 中的视图参数概念和重定向存在根本缺陷?我对无法在重定向中幸存的视图范围有同样的问题,为此我必须创建一个自己的范围。(我本可以使用闪光范围)。

4

2 回答 2

5

我可以在 Mojarra 2.1.4 上重现它。这绝对是不可取的。我已将其作为问题 2247报告给 Mojarra 家伙(如果可以的话,投给它)。顺便说一下,MyFaces 2.1.3 也暴露了同样的问题。

就根本原因在于 JSF 实现特定的实用程序类而言,没有想到此特定问题的简单解决方法。您可以轻松地在/WEB-INF/classesViewHandlerImplExternalContextImpl.

但是,由于您已经在使用<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@ConversationScopedMyFaces CODI

于 2011-11-17T12:29:45.030 回答
1

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

只需使用更新的版本。

于 2013-04-16T23:20:32.670 回答