Jsf 2 在其他会话(CSRF)中重用ViewState值
我使用的是*myfaces-api-2.2.3,javax.faces.STATE\u SAVING\u方法设置为client 我得到了下面的场景 1)User X登录系统并添加用户XXX(使用jsf:ajax操作),在检查chrome开发工具时,您可以看到提交的表单以及ViewState值 2)复制该ViewState值(从chrome开发工具-->网络选项卡)-->将其放入html文件中,格式为(模仿我原来的添加用户X) 3)从用户X会话注销(会话在此过程中无效) 4)使用用户Y-->登录在浏览器中打开该html文件并点击表单-->的提交按钮,您将注意到添加了用户XXX(尽管表单中使用的ViewState值属于其他用户(用户X) 我认为ViewState值不能以这种方式使用,我认为它应该防止这种行为,为什么在一个拥有自己的ViewState值的全新会话中可以使用一个ViewState值,我如何确保用户不能重用ViewStateJsf 2 在其他会话(CSRF)中重用ViewState值,jsf-2,viewstate,jsf-2.2,myfaces,Jsf 2,Viewstate,Jsf 2.2,Myfaces,我使用的是*myfaces-api-2.2.3,javax.faces.STATE\u SAVING\u方法设置为client 我得到了下面的场景 1)User X登录系统并添加用户XXX(使用jsf:ajax操作),在检查chrome开发工具时,您可以看到提交的表单以及ViewState值 2)复制该ViewState值(从chrome开发工具-->网络选项卡)-->将其放入html文件中,格式为(模仿我原来的添加用户X) 3)从用户X会话注销(会话在此过程中无效) 4)使用用户Y-->登录在
请参阅我的其他问题和答案:这是使用客户端状态保存时指定/预期的行为。JSF视图状态不会保存在会话中,而是全部保存在客户端HTML表单中的隐藏输入字段中。只有在使用服务器端状态保存时,JSF视图状态才会在保存时失效在用户的HTTP会话中不存在 在MyFaces中,我没有看到在回发期间与“错误”会话重新关联的情况下使客户端保存的状态无效。
org.apache.MyFaces.client\u VIEW\u state\u TIMEOUT
上下文参数接近。您可以将其设置为与会话超时相同的时间
CSRF攻击场景有点夸张。首先,攻击者需要能够掌握客户端状态。最简单的方法是XSS漏洞。只是,JSF到处都有XSS攻击预防(如果小心使用escape=“false”
)。最困难的方法是掌握整个HTML输出。这可以由中间人攻击完成。只是,这也会给攻击者提供整个会话cookie,因此在这种情况下,整个CSRF攻击场景“不必要地过度复杂化”对于攻击者来说,因为攻击者可以简单地劫持会话。针对这一情况的最佳防护措施是使用HTTPS而不是HTTP
即使如此,如果攻击者以某种方式控制了客户端视图状态,攻击者也无法在不解密、取消序列化和操作它的情况下使用它做很多危险的事情。MyFaces默认情况下会对它进行长时间加密(早在2.0.x早期就已经开始了)。如果没有正确的密钥,攻击者无法对其进行解密,因此也无法对其进行操作。顺便说一句,此客户端视图状态加密已成为JSF 2.2规范的必需部分(Mojarra也这样做)。在重新启动应用程序服务器时,默认情况下会重置此密钥(因此,所有客户端状态都将无效)。如有必要,您可以在web.xml
中的环境条目下方指定一个固定键:
jsf.ClientSideSecretKey
java.lang.String
[Base64格式的AES密钥]
您可以使用生成Base64格式的随机AES密钥
即使如此,如果攻击者以某种方式成功解密视图状态并让另一个用户实际提交它(例如,通过XSS漏洞或钓鱼网站),那么您最好的选择是在JSF页面中包含一个基于HTTP会话的CSRF令牌。但是,如果webapp的某个地方仍然存在XSS攻击漏洞,或者通过HTTP而不是HTTPS提供服务,那么这也是不安全的
另见:
h:form
,相反,我更喜欢一个单点条目,在该条目中,我将向表单
注入令牌,然后在提交时将针对serverOverrideh:form
呈现器上的令牌进行测试。在encode中写入令牌并验证解码时使用。如果您使用PrimeFaces,请小心使用partialSubmit=“true”
,如果您没有明确指定它,它将跳过标记。谢谢,我正在使用PF,我应该如何为PrimeFaces明确指定它?(我可以打开一个