CSRF
1.CSRF是什么?
Cross-site request forgery简称为“CSRF”,跨站请求伪造,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行攻击,用户一旦点击了这个请求,整个攻击也就完成了,所以CSRF攻击也被称为“one click”攻击。
2.CSRF可以做什么?
攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账…造成的问题包括:个人隐私泄露以及财产安全。
3.攻击原理
网站的cookie在浏览器中不会过期,只要不关闭浏览器或者退出登录,那以后只要是访问这个网站,都会默认你已经登录的状态,而在这个期间,攻击者发送了构造好的CSRF脚本或包含CSRF脚本的链接,可能会执行一些用户不想做的功能。过程如下:
- 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A。
- 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A。
- 用户未退出网站A之前,在同一浏览器中,打开一个TAB页面访问网站B。
- 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A。
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
4.防御方案
关于防御方案,一般有如下几种:
- 用户操作验证,在提交数据时需要输入验证码。
一般用在登陆(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)。 - 访问控制安全管理。
敏感信息的修改时需要对身份进行二次认证,例如:修改账号时,需要验证旧的密码。
敏感信息的修改使用POST,而不是GET。
通过http投不中的referer来限制原页面。 - 请求来源验证,验证请求来源的referer。
- 表单token验证。
现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。 - 在前后端分离的前提下(例如使用ajax提交数据)设置不了token,可以给 cookie 新增 SameSite 属性,通过这个属性可以标记哪个 cookie 只作为同站 cookie (即第一方 cookie,不能作为第三方 cookie),既然不能作为第三方 cookie ,那么别的网站发起第三方请求时,第三方网站是收不到这个被标记关键 cookie,后面的鉴权处理就好办了。这一切都不需要做 token 生命周期的管理,也不用担心 Referer 会丢失或被中途被篡改。
- 关于安全的会话管理(避免会话被利用)。
不要再客户端保存敏感信息(比如身份认证信息);
测试直接关闭,退出时的会话过期机制;
设置会话国企机制,比如几分钟内误操作,自动登陆超时。