繁体   English   中英

如何加密在客户端生成冒号分隔的随机数的 ViewState(服务器存储)?

[英]How to encrypt ViewState (server stored) that generates colon separated random numbers on client?

我有一个基于Mojarra 2.1.20构建的应用程序(包 com.sun.faces,注册机为 JSF 2.2 规范)。 我有一个上下文参数 javax.faces.STATE_SAVING_METHOD,其值为我的应用程序部署描述符文件 web.xml 中指定的服务器

JSF 正在我的登录后页面上注入以下 ViewState 隐藏元素

<input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="random_number1:random_number2" autocomplete="off" />

隐藏元素具有某种随机数格式的值,并以冒号分隔。 由于STATE_SAVING_METHOD是服务器,在我的例子中实际的 ViewState 被存储在服务器上。 但客户端只是从服务器获取唯一的 ViewState 标识符或随机数 我的理解是,当用户提交带有此隐藏元素的表单时,服务器会提取这些随机数,从这些数字中识别出实际的 ViewState,然后处理请求并将响应发送回客户端/用户。

基于以上理解,我对 ViewState 及其漏洞有以下疑问-

  • 为什么两个冒号分隔随机数而不是一个? 这两个冒号分隔的随机数代表什么? autocomplete="off" 是什么意思?

  • 这些服务器是否为存储在服务器上的实际 ViewState 生成了随机数 map? 这种理解是否正确?

  • 这些服务器生成的随机数是否已经采用加密格式? 这些随机数是否需要加密以潜在地避免数据泄漏和应用程序中的其他漏洞?

  • 当 ViewState 保存在服务器上时,如何在我的情况下加密这些随机数?

  • 我们能否以某种方式避免在源中注入元素而不显示为隐藏元素?

为什么两个冒号分隔随机数而不是一个? 这两个冒号分隔的随机数代表什么?

视图 state 基本上存储在嵌套的 map 中,如Map<FirstId, Map<SecondId, ViewState>> 这个 map 又存储在HttpSession中。 第一个 ID 是“逻辑”视图 ID(基本上表示 XHTML 页面本身),第二个 ID 是“实际”视图 state ID。

autocomplete="off" 是什么意思?

它阻止 web 浏览器使用先前从浏览器缓存中提交的值自动填充输入元素的值。 不需要它,因为该值已经预填充并且输入元素是隐藏类型,但已知较旧的 Firefox 版本会错误地覆盖它。 使用autocomplete="off"基本上可以解决它们。

这些服务器是否为存储在服务器上的实际 ViewState 生成了随机数 map? 这种理解是否正确?

是的。

这些服务器生成的随机数是否已经采用加密格式? 这些随机数是否需要加密以潜在地避免数据泄漏和应用程序中的其他漏洞?

不。

当 ViewState 保存在服务器上时,如何在我的情况下加密这些随机数?

没有必要。

我们能否以某种方式避免在源中注入元素而不显示为隐藏元素?

没有必要。 首先,您仍然需要JSESSIONID cookie 才能成功执行视图 state 注入。 但是,当手头已经有了JSESSIONID cookie 时,无论如何都会遇到比仅ViewState篡改更大的问题,例如潜在的 XSS 漏洞。 此外,在服务器端 state 保存“注入”视图 state 的情况下,只能是用户自己的视图 state 从同一 HTTP session 中的另一个页面获得,绝对不是来自完全不同的用户/会话的随机视图。

只有当视图 state 存储在ServletContext (应用程序范围)而不是HttpSession (session 范围)中时,您的安全问题才会适用。 但事实显然并非如此。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM