我正在使用*myfaces-api-2.2.3并将javax.faces.STATE_SAVING_METHOD设置为client,
我有以下场景,
1)用户X登录系统并添加用户XXX(使用jsf f:ajax操作),同时检查chrome dev工具,您可以看到与ViewState值一起提交的表单.
2)复制ViewState值(来自chrome dev工具 - >网络选项卡) - >将其放入带有表单的html文件中(模仿我原来的添加用户X)
3)从用户X会话注销(会话在该过程中失效)
4)用户Y登录 - > 在浏览器中打开该 html文件并点击表单的提交按钮 - >你会注意到添加了用户XXX(尽管表格中使用的ViewState值属于其他用户(用户X).
我认为ViewState的价值不能以这种方式被使用,我认为应该阻止这种行为,怎么就可以使用一个的ViewState在拥有自己的一个全新的会话值ViewState的价值,以及如何能我确保用户不能重用ViewState?
请参阅我的另一个问题和BalusC的回答:在客户端状态保存的情况下防止JSF2中的CSRF
我正在使用MyFaces 2.2.3与客户端状态保存+ PrimeFaces
在询问如何阻止BalusC告诉我在不同会话中重用ViewState之后,我可以通过覆盖渲染器来注入我自己的CSRF令牌,让值为CSRF令牌,
我正在寻找一个不会强迫我修改我的xhtml页面的解决方案:)
BalusC提出了一种通过扩展来防止CSRF攻击的更好方法ViewHandlerWrapper,并且它工作得很好,我只需要通过restoreView以下方式修改一下
public UIViewRoot restoreView(FacesContext context, String viewId) {
UIViewRoot view = super.restoreView(context, viewId);
if (getCsrfToken(context).equals(view.getAttributes().get(CSRF_TOKEN_KEY))) {
return view;
} else {
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
if (session != null) {
session.invalidate(); //invalidate session so (my custom and unrelated) PhaseListener will notice that its a bad session now
}
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("CSRF detected and blocked"); //better looking …Run Code Online (Sandbox Code Playgroud) 我们最近收到了来自 IBM AppScan DAST 的结果,其中一些结果没有多大意义。
2.Medium——跨站请求伪造
风险:可能会窃取或操纵客户会话和 cookie,它们可能被用来冒充合法用户,允许黑客查看或更改用户记录,并以该用户身份执行交易 修复:验证价值“Referer”标头,并为每个提交的表单使用一次性随机数
以下更改应用于原始请求:
将标头设置为“ http://bogus.referer.ibm.com ”
推理:
测试结果似乎表明存在漏洞,因为测试响应与原始响应相同,表明跨站点请求伪造尝试成功,即使它包含一个虚构的“Referer”标头。
请求/响应:
Run Code Online (Sandbox Code Playgroud)POST /**/main.xhtml HTTP/1.1 -- **This xhtml only opens a default menu on page load** User-Agent: Mozilla/4.0 (compatible; MS推荐修复
验证“Referer”标头的值,并为每个提交的表单使用一次性随机数。
javax.faces.ViewState 具有隐式 CSRF 保护。
https://www.beyondjava.net/jsf-viewstate-and-csrf-hacker-attacks
我还可以使用受保护的视图进行显式 CSRF 保护。这种显式 CSRF 保护为所有情况添加了一个令牌,并额外添加了对“引用者”和“来源”HTTP 标头的检查。(参考 Bauke & Arjan 图书权威指南)
该报告还将 /javax.faces.resource/ 标记为 CSS , JS ,我认为报告中误报的字体。
寻找反馈和一些见解。