我有一个支持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上的任何属性都可以由客户端设置吗?如果没有,我应该假设客户可以设置哪些(因此在验证期间必须担心)?
如果我有条件地呈现我的表单会发生什么? e.g:
<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流量发送到我的网站的任何内容。例如,可能是恶意代码。
答案 0 :(得分:2)
用户可以设置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有任何安全漏洞;这不是因为本身没有,而只是因为我没有密切使用/跟踪它。