Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 在其他会话(CSRF)中重用ViewState值_Jsf 2_Viewstate_Jsf 2.2_Myfaces - Fatal编程技术网

Jsf 2 在其他会话(CSRF)中重用ViewState值

Jsf 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-->登录在

我使用的是*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值,我如何确保用户不能重用ViewState



请参阅我的其他问题和答案:

这是使用客户端状态保存时指定/预期的行为。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提供服务,那么这也是不安全的

另见:

仅供参考:这是客户端状态保存的指定/预期行为。只是不确定如何回答“如何确保用户无法重用ViewState”对于MyFaces,而不是切换回服务器端状态保存。此外,CSRF的可能性有点夸张,因为视图状态基本上包含组件状态、未登录的用户和其他会话数据。这完全取决于表单,例如,如果是用于用户管理的某个管理表单,攻击者可以准备一些状态(例如,为自己分配管理员角色)并让管理员用户提交,但您仍然需要XSS漏洞和/或会话劫持。viewstate ID不应该随着会话@BalusC一起消失吗?只应该随着服务器端状态保存而消失。另请参阅a.o.@BalusC,我理解,对于当前的实现,它只会随着服务器端状态保存而“消失”,但如果视图状态ID(仅是ID)消失了在一个会话范围内的“有效视图状态ID”列表中,这个问题被解决了。我不认为它是一个“bug”或“真正的安全问题”,而是一个可以被改进的“遗漏”。谢谢你的回答,所以你是说如果我继续使用客户端的状态保存,我将能够阻止我在我的问题中描述的一个场景。为每个会话生成我自己的csrf令牌,并在每个客户端->服务器请求时检查所使用的令牌是否等于该会话的当前令牌?如果您想保持客户端视图状态保存,这确实是您的最佳选择。并且,确保您没有XSS漏洞,并且webapp通过HTTPS提供。好的,谢谢,不是吗这里有一种将令牌注入从客户端到服务器的所有POST提交的方法,我不想修改我所有的
h:form
,相反,我更喜欢一个单点条目,在该条目中,我将向
表单
注入令牌,然后在提交时将针对serverOverride
h:form
呈现器上的令牌进行测试。在encode中写入令牌并验证解码时使用。如果您使用PrimeFaces,请小心使用
partialSubmit=“true”
,如果您没有明确指定它,它将跳过标记。谢谢,我正在使用PF,我应该如何为PrimeFaces明确指定它?(我可以打开一个