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

msa*_*din 13 redirect el jsf-2 viewparams

我有一个定义视图参数的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>
Run Code Online (Sandbox Code Playgroud)

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

<h:form id="some-id">
  <h:inputText value="#{nbsearchpage.searchName}" />
  <h:commandButton value="search" action="#{nbsearchpage.search}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)

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

?faces-redirect=true&amp;includeViewParams=true
Run Code Online (Sandbox Code Playgroud)

它为用户提供了一个很好的URL.当用户在搜索字段中输入"IBM"时,URL将重定向到

?searchName=IBM 
Run Code Online (Sandbox Code Playgroud)

它非常好用.但现在用户可以在searchName文本字段中输入EL表达式,并评估EL表达式.例如,当用户在文本字段中输入"#{2 + 2}"时,URL将被重定向到

?searchName=4
Run Code Online (Sandbox Code Playgroud)

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

有任何想法如何防止这种自动EL解析?我认为JSF2中的视图参数概念存在一个根本性的缺陷并且具有重定向功能?我遇到了与重定向无法生存的视图范围相同的问题,为此我必须创建一个自己的范围.(我本可以使用闪存范围).

Bal*_*usC 5

我可以在Mojarra 2.1.4上重现这一点.这绝对是不可取的.我已经向Mojarra家伙报告了问题2247(如果可以,请投票支持).顺便说一句,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>
Run Code Online (Sandbox Code Playgroud)

而是在预渲染视图事件侦听器中执行操作方法.这也是在JSF中使用GET表单的更合适的方式,<h:form>仅适用于POST.


具体问题无关:

我遇到了与重定向无法生存的视图范围相同的问题,为此我必须创建一个自己的范围.

幸存的重定向从未成为视图范围的意图.只要您与同一视图交互(特别是通过Ajax和有条件地重新呈现内容),视图范围就可以生存.你基本上是在寻找对话范围.您已经查看了CDI @ConversationScopedMyFaces CODI.