用户可以设置 JSF 支持 bean 中的哪些属性?

Posted

技术标签:

【中文标题】用户可以设置 JSF 支持 bean 中的哪些属性?【英文标题】:Which properties in a JSF backing bean can be set by a user? 【发布时间】:2013-07-15 04:20:08 【问题描述】:

我有一个支持 bean (somebean),它具有三个布尔属性 abc,每个属性都有一个 getter 和 setter。

我有一个如下所示的表单:

<h:outputText rendered="#somebean.b">
    B is true
</h:outputText>
<h:form id="blah">
  <h:inputHidden value="#somebean.a" id="a"/>
  <h:commandLink id="zzzz" value="do it" action="#somebean.doIt"/>
</h:form>

abc 三个属性中的哪一个可以由客户端设置?我尝试将b=truec=true 添加到POST 请求中,但是SomeBean.setB(boolean)SomeBean.setC(boolean) 从未被调用。所以也许只能设置a——逻辑是如果JSF中有一个设置它的字段,客户端就可以设置它。但也许我错了,它只是有一些我不知道的默认名称可以用来设置它...

我是否应该假设我的 bean 上的任何属性都可以由客户端设置?如果没有,我应该假设客户端可以设置哪些(因此在验证期间必须担心)?

如果我的表单有条件地呈现,会发生什么?例如:

<h:outputText rendered="#somebean.b">
    <h:form id="blah">
      <h:inputHidden value="#somebean.a" id="a"/>
      <h:commandLink id="zzzz" value="do it" action="#somebean.doIt"/>
    </h:form>
</h:outputText>

在这种情况下,如果b为假,a还能设置吗?


“客户端”是指向我的网站发送 HTTP 流量的任何东西。例如,可能是恶意代码。

【问题讨论】:

【参考方案1】:

用户可以设置 JSF 支持 bean 中的哪些属性?

绑定到EditableValueHolder 组件的那些,例如UIInput 和朋友(包括&lt;f:viewParam&gt;!),前提是他们在应用请求值阶段是rendered="true"disabled="false"readonly="false"

另一种可能的方法是通过请求范围 bean 的属性上的 @ManagedProperty("#param.xxx") 或在 HTTP 请求期间调用的某些 bean 方法中硬编码的 ExternalContext#getRequestParameterMap() 访问。

因此,当您作为开发人员明确地将属性绑定到呈现的、非禁用/只读的可编辑值持有者组件时,或者当您作为开发人员明确设置请求时参数作为属性。在 JSF 实现的当前版本中,绝对没有关于通过 HTTP 方式设置未声明/未绑定属性的可能性的安全漏洞。甚至不可能通过欺骗 HTTP 请求向UISelectOneUISelectMany 组件发送任意值,它只会以"Validation Error: Value is not valid" 结束。


关于旧 JSF 实现中的安全漏洞,仅当您在早于 2.0.7 和 2.1.5 的 Mojarra 版本中使用 includeViewParams="true" 导航到不同视图时,视图参数中的所有 EL 表达式因为#bean.setArbitraryProperty('foo') 将被评估。另见issue 2247。我不知道 MyFaces 中有任何安全漏洞;这并不是因为它本身没有,而仅仅是因为我没有仔细使用/跟踪它。

【讨论】:

有权威人士引用这个吗?对我来说,安全模型是否受 Web 标记的影响听起来很可疑。再一次,您似乎是 JSF 信息的权威来源

以上是关于用户可以设置 JSF 支持 bean 中的哪些属性?的主要内容,如果未能解决你的问题,请参考以下文章

为什么GlassFish 5.1.0中的JSF将我的@ViewScoped CDI bean的ID属性设置为null?

如何将 JSF 组件绑定到支持 bean 属性

JSF 如何从支持 bean 重定向到支持 bean 中动态构建的 URL?

Spring 安全性和 JSF:在登录时调用支持 bean 的方法?

是否在会话范围的 JSF 支持 bean 中观察到 CDI 事件

从支持 bean 访问 JSF 组件标记属性值