我正试图弄清楚如何使用JSF 1.2和Mojarra加密视图状态。奇怪的是,在某些服务器上,它似乎是默认加密的,但在其他服务器上却没有。例如,在我的本地主机上,我看到以下内容:
<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-40233784603124937:-3413182513789758151" autocomplete="off" />
但在我们的测试环境服务器上,我得到了:
<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id4:j_id5" />
你会注意到这两者之间的两个区别:
- 第一个具有autocomplete="off">
- 第一个具有加密的viewState值,而第二个没有
问题是,我一辈子都搞不清楚为什么两者不同。本地主机上的代码库与服务器上的相同。在我的web.xml中没有指定任何配置选项,所以我会假设我的localhost不会被加密(因为这是默认设置,对吧?(。
根据Mojarra文件,我应该添加:
<env-entry>
<env-entry-name>com.sun.faces.ClientStateSavingPassword</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
<env-entry-value>[SOME VALUE]</env-entry-value>
</env-entry>
但这似乎是专门用于客户端状态保存的,而不是服务器端状态保存。除非我有误解,否则我使用服务器端状态保存(至少,我在任何地方都找不到我们配置的javax.faces.state_AVING_METHOD.
所以,我的问题是:
- 为什么本地主机和服务器之间的配置不同?除了web.xml之外,还有其他地方可以指定选项吗
- 如何在我们所有的服务器上启用viewState加密(就像在本地主机上一样(
配置:
- Jboss 5.1.0.GA
- Mojarra 1.2_12-b01-FCS
- 2.2.0.GA接缝
视图状态隐藏字段中的autocomplete="off"
是根据第1129期在Mojarra 1.2_13中引入的。不同视图状态ID算法(对CSRF攻击不太敏感(是在Mojarra 1.2_14中引入的(我找不到相应的问题报告,我只知道它是第一次为JSF 2.0指定的,后来后移植到Mojarra1.2(
考虑到这些症状,您的测试环境看起来实际上至少运行Mojarra 1.2_14。调整您的JSF版本。Mojarra 1.2目前已经是1.2_16。请注意,JBoss默认附带Mojarra。