【问题标题】:Which properties in a JSF backing bean can be set by a user?用户可以设置 JSF 支持 bean 中的哪些属性?
【发布时间】: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 流量的任何东西。例如,可能是恶意代码。

【问题讨论】:

    标签: java security jsf


    【解决方案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 信息的权威来源
    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多