1、什么是CSRF
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。尽管听起来像跨站脚本XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性
2、CSRF原理
3、CSRF的特点
- 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
- 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
- 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
- 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险。
4、几种常见的攻击类型
①GET类型的CSRF
如果一个网站某个地方的功能,比如用户修改邮箱是通过GET请求进行修改的。如:/user.php?id=1&email=123@163.com ,这个链接的意思是用户id=1将邮箱修改为123@163.com。当我们把这个链接修改为 /user.php?id=1&email=abc@163.com ,然后通过各种手段发送给被攻击者,诱使被攻击者点击我们的链接,当用户刚好在访问这个网站,他同时又点击了这个链接,那么悲剧发生了。这个用户的邮箱被修改为 abc@163.com 了
②POST类型的CSRF
在普通用户的眼中,点击网页->打开试看视频->购买视频 是一个很正常的流程。可是在攻击者的眼中是不正常的,这是由于开发者安全意识不足所造成的。
攻击者在购买处抓到购买时候网站处理购买(扣除)用户余额的地址。比如:/coures/user/handler/25332/buy.php 。通过提交表单,buy.php处理购买的信息,这里的25532为视频ID。那么攻击者现在构造一个链接,链接中包含以下内容:
当用户访问该页面后,表单会自动提交,相当于模拟用户完成了一次POST操作,自动购买了 id 为 25332 的视频,从而导致受害者余额扣除。
5、预防CSRF攻击的方法
预防CSRF攻击的方法有很多种,其中一些常见的措施包括:
1、验证HTTP Referer:验证HTTP请求头中的Referer字段的值,也就是验证请求中的来源网站地址,如果不在白名单之内,则认为是伪造请求。这种方法可以有效地防止CSRF攻击,但是也有可能会影响到正常用户的访问。因此,需要谨慎地设置白名单,确保只允许来自可信网站的请求通过。
2、使用Token令牌:在服务端生成一段Token,前端每次提交请求到后端的时候,检验该Token是否携带Token且是否为自己生成,如果不是,则拦截掉该请求。这种方法可以有效地防止CSRF攻击,因为只有经过授权的用户才能获取到正确的Token。但是,这种方法也有可能会影响到用户体验,因为每次提交请求都需要进行Token校验。
3、使用验证码:验证码是一种非常有效的防止CSRF攻击的方法,可以通过生成随机数等形式进行验证。用户需要输入验证码才能进行操作,从而避免了攻击者利用用户的身份验证信息进行非法操作。但是,这种方法也有可能会影响到用户体验,因为用户需要输入验证码才能进行操作。
4、使用POST接口:相比GET接口,POST接口的请求不容易被篡改,因此建议使用POST接口进行敏感操作。这是因为GET请求会将参数附加在URL中,而URL可以被篡改;而POST请求会将参数放在请求体中,无法被篡改。因此,对于敏感操作,建议使用POST接口进行提交。
5、限制IP访问:限制同一个IP地址的访问频率,可以有效防止大规模的CSRF攻击。这种方法可以防止攻击者利用大量的IP地址进行CSRF攻击。但是,这种方法也有可能会影响到正常用户的访问。因此,需要谨慎地设置IP访问限制条件,确保不会影响到正常用户的访问。 除了以上常见的预防措施外,还有一些其他的预防方法:
6、使用HTTPOnly Cookie:将Cookie设置为HTTPOnly可以防止JavaScript脚本访问Cookie中的数据,从而增加了攻击者利用跨站脚本(XSS)漏洞来获取用户身份验证信息的难度。这种方法可以有效地防止CSRF攻击和其他攻击向量。
7、定期更新用户凭证:用户凭证包括用户名、密码等敏感信息。定期更新用户凭证可以降低被攻击者利用的风险。即使攻击者获取了用户的旧凭证,也无法继续使用该凭证进行登录或操作。 增加用户教育:通过增加用户教育来提高用户的安全意识。例如,提醒用户不要随意点击来自未知来源的链接或下载未知来源的文件;不要将个人信息或密码泄露给他人;定期更新密码等。这些措施可以降低用户被攻击的风险。
8、使用最新的安全技术:随着技术的发展和黑客攻击手段的不断更新换代,最新的安全技术可以提供更好的保护效果。例如,使用内容安全策略(CSP)可以防止跨站脚本(XSS)攻击;使用HTTP严格传输安全(HSTS)可以防止中间人攻击等。这些技术都可以有效地提高网站的安全性。
9、使用第三方安全服务:有些安全服务提供商提供了CSRF保护服务,通过集成到应用程序中可以有效地防止CSRF攻击。这些服务通常基于Token令牌等技术提供保护,可以有效地提高应用程序的安全性。