本系列的译文暂停很久了,今后每周一篇直至完成
原文地址:
http://www.jtmelton.com/2012/02/07/year-of-security-for-java-week-6-csrf-prevention-in-java/
Whatis it and why should I care?
跨站点请求伪造(CSRF)是指受害者当被一个网站授权后,在其未知觉的情况下被强行向这个网站发起一个未知的或者未期望的请求。网站的授权凭证通常以浏览器的cookie方式保存,每次请求会自动传送到服务器。利用这种原理,攻击者可以诱使受害者对网站执行几乎所有存在CSRF漏洞的请求。
下面图片简要揭示了CSRF攻击的基本流程:
第一步:诱使受害者访问一个恶意网站(evil.com)
第二步:受害者的浏览器加载拥有一个隐藏图片的恶意网站,这张图片有一个指向目标网站good.com的脚本指令。
第三步:受害者的浏览器将good.com会话cookie(通常是认证信息)发送到good.com上,并且在good.com上执行这个指令
第四步:指令执行之后受害者才知道结果,或者全然不知。
Whatshould I do about it?
既然知道了CSRF的原理和危害,那考虑一些解决方案:
Token令牌
经典的CSRF解决方案是为每个session分配一个token(例如同步标志位设计方案):
基本流程:
第一步:用户登陆之后,将一个随机字符串放到用户session中
第二步:在所有的非幂等性的表单提交请求中(意思是任何修改服务器状态的请求应该是通过HTTP Posts的方式提交的),当表单提交的时候,token也是其中的一个请求参数。
第三步:负责这个非幂等性请求的处理器会验证提交进来的token参数是否和session中保存的token参数一致。如果提交的token缺失或者不一致,则拒绝这个请求。
经过多年的验证这个方案能够完美适用于几乎所有的场景。但是也有缺点:
1、 实现这个方案很耗时间。
2、 特殊情况下能绕过某些请求的验证。
ESAPI(https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API)项目内置基于授权模型的CSRF防护实现。这里有一份我之前写的关于ESAPI CSRF实现的文章:(http://www.jtmelton.com/2010/05/16/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf/)
CSRFGuard
OWASP CSRFGuard项目(https://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project)是一个可靠的CSRF防护方案,使用这个方案仅仅需要在你的应用中添加一个filter和相应的配置文件。这是一个值得研究的项目。
Stateless CSRFProtection
还有一个有趣的防护实现是stateless CSRF方案(http://appsandsecurity.blogspot.com/2012/01/stateless-csrf-protection.html),作者是John Wilander(https://twitter.com/#!/johnwilander)。John提出一个有创意的想法:服务器端不需要在用户会话中保存相应的token,由客户端来生成一个防止CSRF Token的cookie(每次请求都提交到服务器),同时每次提交都将这个token当做一个请求参数。因为攻击者不能同时获取到目标网站的token cookie和token请求参数,服务端只需要验证这个token请求参数和token cookie是否一致就可以了。在我的印象中,这个方案还没有被广泛的测试验证过,但能够优雅解决这个复杂的问题,或许时间能够证明stateless CSRF是一个更好的方案。
CSRF攻击是一个流行且危险的攻击方式,但是通过上面的防护方案,就能妥善解决这个风险。
最后需要注意的是token令牌方式在有XSS漏洞的网站上是无法起作用的。因为攻击者可以根据XSS漏洞读取当前正在使用的token令牌,这样就能够绕过基于Token方式的防护方案。解决方法很简单:修复XSS漏洞!
References
———–
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet
http://www.cgisecurity.com/csrf-faq.html
http://www.jtmelton.com/2010/05/16/the-owasp-top-ten-and-esapi-part-6-cross-site-request-forgery-csrf/
https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
https://www.owasp.org/index.php/Category:OWASP_CSRFGuard_Project