用户可以设置 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
),它具有三个布尔属性 a
、b
和 c
,每个属性都有一个 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
、b
和c
三个属性中的哪一个可以由客户端设置?我尝试将b=true
和c=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
和朋友(包括<f:viewParam>
!),前提是他们在应用请求值阶段是rendered="true"
、disabled="false"
和readonly="false"
。
另一种可能的方法是通过请求范围 bean 的属性上的 @ManagedProperty("#param.xxx")
或在 HTTP 请求期间调用的某些 bean 方法中硬编码的 ExternalContext#getRequestParameterMap()
访问。
因此,仅当您作为开发人员明确地将属性绑定到呈现的、非禁用/只读的可编辑值持有者组件时,或者当您作为开发人员明确设置请求时参数作为属性。在 JSF 实现的当前版本中,绝对没有关于通过 HTTP 方式设置未声明/未绑定属性的可能性的安全漏洞。甚至不可能通过欺骗 HTTP 请求向UISelectOne
或UISelectMany
组件发送任意值,它只会以"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 重定向到支持 bean 中动态构建的 URL?
Spring 安全性和 JSF:在登录时调用支持 bean 的方法?