在 JSF 1.2 中使用 Mojarra 配置 JSF 视图状态加密
Posted
技术标签:
【中文标题】在 JSF 1.2 中使用 Mojarra 配置 JSF 视图状态加密【英文标题】:Configuring JSF viewstate encryption in JSF 1.2 with Mojarra 【发布时间】:2013-02-12 12:23:37 【问题描述】:我试图弄清楚如何使用 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 不会被加密(因为这是默认设置,对吗?)。
每个the Mojarra documentation 我应该补充:
<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_SAVING_METHOD 的任何地方。
所以,我的问题:
-
为什么我的配置在 localhost 和服务器之间会有所不同?除了 web.xml,还有其他选项可以指定吗?
如何在我们所有的服务器上启用 viewState 加密(例如在我的本地主机上)?
配置:
Jboss 5.1.0.GA Mojarra 1.2_12-b01-FCS Seam 2.2.0.GA【问题讨论】:
【参考方案1】:根据issue 1129,在 Mojarra 1.2_13 中引入了视图状态隐藏字段中的 autocomplete="off"
。 Mojarra 1.2_14 中引入了不同的视图状态 ID 算法(对 CSRF 攻击敏感度较低)(我找不到相应的问题报告,我只知道它是第一次为 JSF 2.0 指定的,后来被反向移植到Mojarra 1.2)。
鉴于这些症状,您的测试环境看起来实际上至少运行 Mojarra 1.2_14。对齐您的 JSF 版本。 Mojarra 1.2 是 currently 已经在 1.2_16。请注意,JBoss 默认附带 Mojarra。
【讨论】:
谢谢,我会在服务器上搜索 Mojarra 版本。我从 jboss 配置文件中提取了 1.2_12,但也许我们有一些覆盖它的东西。稍后会报告。 另一个可能的原因是脏的类路径。例如。在/JRE/lib
或/JRE/lib/ext
中删除了JSF 库,以修复javac
或IDE 中的编译错误(一些根本不理解“类路径”概念的初学者会这样做)。
你是对的。似乎在某个时候有人更新了与我们的开发环境一起分发的 Mojarra jar。那是 1.2_14,而我们的其他环境是 1.2_12。这就解释了问题。我假设视图状态 ID 算法实际上向后移植到 1.2_14,而不是 1.2_15。感谢您的帮助!
奇怪,我在1.2_14 release notes 的任何地方都没有看到它。为了正确起见,无论如何我都会更新答案。以上是关于在 JSF 1.2 中使用 Mojarra 配置 JSF 视图状态加密的主要内容,如果未能解决你的问题,请参考以下文章
为 JSF 下载 Mojarra 库时,在 Eclipse 中显示错误“zip 文件为空”
JSF 2.2 内存消耗:为啥 Mojarra 将最后 25 个视图的 ViewScoped Beans 保留在内存中?