CSRF是什么?
CSRF(Cross Site Request Forgery),中文是跨站点请求伪造。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。
举个例子
简单版:
假如博客园有个加关注的GET接口,blogUserGuid参数很明显是关注人Id,如下:
http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315
那我只需要在我的一篇博文内容里面写一个img标签:
<img style="width:0;" src="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx?blogUserGuid=4e8c33d0-77fe-df11-ac81-842b2b196315" />
那么只要有人打开我这篇博文,那就会自动关注我。
升级版:
假如博客园还是有个加关注的接口,不过已经限制了只获取POST请求的数据。这个时候就做一个第三方的页面,但里面包含form提交代码,然后通过QQ、邮箱等社交工具传播,诱惑用户去打开,那打开过博客园的用户就中招了。
在说例子之前要纠正一个iframe问题,有人会直接在第三方页面这样写。如下:
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>CSRF SHOW</title> </head> <body> <!--不嵌iframe会跳转--> <iframe style="display:none;"> <form name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post"> <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/> <input type="submit" value> </form> <script> document.forms.form1.submit(); </script> </iframe> </body> </html>
这样是用问题的,由于同源策略的原因,iframe内容根本加载不出来,所以里面form提交当然不会执行。
PS:我尝试了chrome、IE11、Firefox,情况都是这样。
所以可以用嵌多一层页面方式解决,如下:
第一个展示页面(test):
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>CSRF SHOW</title> </head> <body> <iframe style="display:none;" src="test2.html"></iframe> </body> </html>
第二个隐藏页面(test2):
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>CSRF GET</title> <body> <form name="form1" action="http://www.cnblogs.com/mvc/Follow/FollowBlogger.aspx" method="post"> <input type="hidden" name="blogUserGuid" value="4e8c33d0-77fe-df11-ac81-842b2b196315"/> <input type="submit" value> </form> <script> document.forms.form1.submit(); </script> </body> </html>
这样就可以解决了,有人会问为什么要加多一层iframe,因为不嵌iframe页面会重定向,这样就降低了攻击的隐蔽性。另外我们test页面不使用XMLHTTPRequest发送POST请求,是因为有跨域的问题,而form可以跨域post数据。
进阶版:
假如博客园还是有个加关注的接口,已经限制POST,但博文内容是直接贴进HTML(未过滤),那就遭受XSS攻击。那么就可以直接把上面代码嵌入博文,那么只要有人打开我这篇博文,还是会自动关注我,这组合攻击方式称为XSRF。
CSRF攻击的本质原因
CSRF攻击是源于Web的隐式身份验证机制!Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。CSRF攻击的一般是由服务端解决。
CSRF工具的防御手段
1. 尽量使用POST,限制GET
GET接口太容易被拿来做CSRF攻击,看第一个示例就知道,只要构造一个img标签,而img标签又是不能过滤的数据。接口最好限制为POST使用,GET则无效,降低攻击风险。
当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。
2. 浏览器Cookie策略
IE6、7、8、Safari会默认拦截第三方本地Cookie(Third-party Cookie)的发送。但是Firefox2、3、Opera、Chrome、Android等不会拦截,所以通过浏览器Cookie策略来防御CSRF攻击不靠谱,只能说是降低了风险。
PS:Cookie分为两种,Session Cookie(在浏览器关闭后,就会失效,保存到内存里),Third-party Cookie(即只有到了Exprie时间后才会失效的Cookie,这种Cookie会保存到本地)。
PS:另外如果网站返回HTTP头包含P3P Header,那么将允许浏览器发送第三方Cookie。
3. 加验证码
验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段,不能作为主要解决方案。
4. Referer Check
Referer Check在Web最常见的应用就是“防止图片盗链”。同理,Referer Check也可以被用于检查请求是否来自合法的“源”(Referer值是否是指定页面,或者网站的域),如果都不是,那么就极可能是CSRF攻击。
但是因为服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。但是用Referer Check来监控CSRF攻击的发生,倒是一种可行的方法。
5. Anti CSRF Token
现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。
例子:
1. 用户访问某个表单页面。
2. 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
3. 在页面表单附带上Token参数。
4. 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
注意:
CSRF的Token仅仅用于对抗CSRF攻击。当网站同时存在XSS漏洞时候,那这个方案也是空谈。所以XSS带来的问题,应该使用XSS的防御方案予以解决。
总结
CSRF攻击是攻击者利用用户的身份操作用户帐户的一种攻击方式,通常使用Anti CSRF Token来防御CSRF攻击,同时要注意Token的保密性和随机性。
参考文献:
1. 《浅谈CSRF攻击方式》
2. 《白帽子讲Web安全》
http://www.cnblogs.com/lovesong/p/5233195.html
相关推荐
总的来说,理解并防范CSRF攻击对于保障Web应用的安全至关重要。开发人员应遵循最佳实践,对所有可能改变用户状态的操作进行严格验证,同时提高用户的安全意识,避免点击不明链接。只有这样,才能有效地降低CSRF攻击...
在基于JSP的Java Web项目中,了解如何防御CSRF攻击至关重要,因为这可以保护用户的敏感数据和应用的完整性。 **CSRF攻击原理** CSRF攻击通常发生在用户已登录一个网站并保持会话的情况下,攻击者通过构造恶意链接...
这种攻击之所以有效,是因为Web应用在处理用户的请求时往往依赖于这些凭证来验证用户的身份。 #### 二、CSRF可以做什么? CSRF攻击的核心在于盗用用户的合法身份,在用户不知情的情况下执行恶意操作。攻击者可以...
防止CSRF攻击的关键在于确保请求的完整性和合法性,通过验证额外的安全信息(如Token)以及监控请求来源,可以显著提高Web应用的安全性。开发者应当根据应用的具体情况选择合适的防范措施,以确保用户的数据安全不受...
CSRF攻击之所以危险,是因为它可以绕过网站的安全机制,在未获得用户明确授权的情况下执行敏感操作。例如,攻击者可以通过伪造转账请求,使得用户的银行账户资金被转移至攻击者指定的账户中。这类攻击不仅难以察觉,...
在Web安全领域,它是一种利用用户的已登录状态进行恶意操作的攻击方式。通常,CSRF会被简称为CSRF或XSRF。 **2. CSRF攻击原理** CSRF攻击的核心在于,攻击者能够诱使用户在不知情的情况下,通过他们的浏览器发送...
了解CSRF攻击的产生原因对于构建安全的Web应用程序至关重要。 ### CSRF攻击的条件 1. **用户登录并保存Cookie**:当用户成功登录一个受信任的网站A后,服务器通常会在用户的浏览器中设置一个Session或Cookie来标识...
CSRF攻击利用了用户已经登录并保存了某些敏感信息的Web应用程序,攻击者通过诱导用户执行非预期的操作,从而实现对用户的欺诈或数据窃取。 CSRF攻击的基本原理是,攻击者通过构造一个看似合法的请求,让用户在不...
Web应用安全领域中,CSRF...总的来说,理解和防范CSRF攻击是Web应用安全的关键环节,特别是当它与XSS结合,或者演化为蠕虫形式时,危害更大。开发者和用户都应提高警惕,采取有效的安全措施,避免数据和隐私受到侵犯。
Web应用安全:针对内部网络的CSRF攻击.pptx
Web应用安全:针对内部网络的CSRF攻击.docx
CSRF和XSS攻击是Web应用开发中必须面对的安全挑战。通过本文的详细介绍,你应该能够理解这些攻击的原理和防护策略。在Java Web应用开发中,实施有效的CSRF和XSS防护措施是确保用户数据安全和应用稳定性的关键。随着...
CSRF攻击之所以危险,是因为它能够利用用户的浏览器已保存的会话(session)信息,例如登录状态或Cookie,来执行未授权的命令。 CSRF攻击的定义涵盖了几个关键元素。首先,这种攻击通常发生在用户已经登录到一个...
CSRF攻击是Web应用安全中一个常见的问题, Referer头可以用来防御CSRF攻击,但是攻击者可以通过绕过Referer技巧来欺骗服务器。因此,Web开发者需要采取多种防御措施来防御CSRF攻击,例如验证Token、双重验证、验证码...
综上,防范CSRF攻击需要综合运用多种技术手段,结合主被动策略,同时考虑用户体验和兼容性问题,才能构建出相对完整的安全防护网。在实际应用中,开发者应根据应用的具体场景和风险等级,选择合适的防CSRF措施。
CSRF 攻击可以盗用用户的身份,以用户的名义发送恶意请求,造成的问题包括:个人隐私泄露以及财产安全。 Spring Security 中的 CSRF 防护机制 Spring Security 提供了 CSRF 防护机制,可以保护用户免受 CSRF 攻击...
CSRF攻击之所以能够成功,是因为浏览器默认将用户的Cookies(包括会话ID)与请求一起发送,从而使得攻击者可以利用受害者的身份执行操作。因此,在Web应用开发过程中,加入安全机制来防范此类攻击至关重要。 #### ...
CSRF攻击同样是一种常见的Web安全问题,它利用用户的合法身份,诱导用户在不知情的情况下发起一些非用户的意愿操作。例如,用户在登录状态下,攻击者通过构造特定的URL使用户点击后,自动在用户不知情的状况下执行...
由于CSRF攻击可以绕过用户的知情和同意,导致用户在不知情的情况下做出非意愿的操作,因此,对于任何处理敏感数据或操作的Web应用来说,防范CSRF攻击都是至关重要的。开发人员应遵循最佳实践,确保应用的安全性,...
CSRF(跨站请求伪造)是一种常见的Web安全攻击,其特点是在用户已经通过身份验证的情况下,攻击者诱导用户执行某些操作,从而达到其非法目的。CSRF攻击通常通过用户的浏览器向含有CSRF漏洞的Web应用程序发起请求,...