2

我有一个支持 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>

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

我是否应该假设我的 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>

在这种情况下,如果为假,a仍然可以设置吗?b


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

4

1 回答 1

2

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

那些绑定到EditableValueHolder组件的对象,例如UIInput和朋友(包括<f:viewParam>!),前提是它们是rendered="true"disabled="false"并且readonly="false"在应用请求值阶段。

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

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


至于较旧的 JSF 实现中的安全漏洞,只有当您使用includeViewParams="true"早于 2.0.7 和 2.1.5 的 Mojarra 版本导航到不同的视图时,#{bean.setArbitraryProperty('foo')}才会评估视图参数中的所有 EL 表达式,例如。另见问题 2247。我不知道 MyFaces 中有任何安全漏洞;那不是因为本身没有,而仅仅是因为我没有密切使用/跟踪它。

于 2013-07-17T11:36:26.337 回答