什么是 CSRF 攻击?

概念

CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三方网站,然后该网站向被攻击网站发送跨站请求。如果用户在被攻击网站中保存了登录状态,那么攻击者就可以利用这个登录状态,绕过后台的用户验证,冒充用户向服务器执行一些操作。

CSRF 攻击的本质是利用 cookie 会在同源请求中携带发送给服务器的特点,以此来实现用户的冒充。

攻击类型

常见的 CSRF 攻击有三种:

  • GET 类型的 CSRF 攻击,比如在网站中的一个img 标签里构建一个请求,当用户打开这个网站的时候就会自动发起提交;
  • POST 类型的 CSRF 攻击,比如构建一个表单,然后隐藏它,当用户进入页面时,自动提交这个表单。
  • 链接类型的 CSRF 攻击,比如在 a 标签的href 属性里构建一个请求,然后诱导用户去点击。
如何防御 CSRF 攻击?

CSRF 攻击可以使用以下方法来防护:

进行同源检测,服务器根据 http 请求头中origin 或者referer信息来判断请求是否为允许访问的站点,从而对请求进行过滤。当origin 或者 referer 信息都不存在的时候,直接阻止请求。这种方式的缺点是有些情况下 referer 可以被伪造,同时还会把搜索引擎的链接也给屏蔽了。所以一般网站会允许搜索引擎的页面请求,但是相应的页面请求这种请求方式也可能被攻击者给利用。(Referer字段会告诉服务器该网页是从哪个页面链接过来的)

使用 CSRF Token 进行验证,服务器向用户返回一个随机数Token,当网站再次发起请求时,在请求参数中加入服务器端返回的token,然后服务器对这个 token 进行验证。这种方法解决了使用cookie单一验证方式时,可能会被冒用的问题,但是这种方法存在一个缺点就是,我们需要给网站中的所有请求都添加上这个token,操作比较繁琐。

还有一个问题是一般不会只有一台网站服务器,如果请求经过负载平衡转移到了其他的服务器,但是这个服务器的session中没有保留这个 token 的话,就没有办法验证了。这种情况可以通过改变 token 的构建方式来解决。

对 Cookie 进行双重验证,服务器在用户访问网站页面时,向请求域名注入一个 Cookie,内容为随机字符串,然后当用户再次向服务器发送请求的时候,从 cookie 中取出这个字符串,添加到URL参数中,然后服务器通过对 cookie 中的数据和参数中的数据进行比较,来进行验证。使用这种方式是利用了攻击者只能利用cookie,但是不能访问获取 cookie 的特点。并且这种方法比CSRF Token 的方法更加方便,并且不涉及到分布式访问的问题。这种方法的缺点是如果网站存在 XSS 漏洞的,那么这种方式会失效。同时这种方式不能做到子域名的隔离。

在设置 cookie 属性的时候设置 Samesite ,限制cookie 不能作为被第三方使用,从而可以避免被攻击者利用。Samesite 一共有两种模式,一种是严格模式,在严格模式下 cookie 在任何情况下都不可能作为第三方 Cookie 使用,在宽松模式下,cookie 可以被请求是GET 请求,且会发生页面跳转的请求所使用。

相关推荐
汪子熙4 分钟前
Angular 与 rxjs 中 take(1) 的运用解析
前端·javascript·面试
bug总结42 分钟前
如何在 Vue.js 中集成 Three.js —— 创建一个旋转的 3D 立方体
前端·javascript·vue.js
J船长1 小时前
Flutter,从Text 说起 立即调用函数表达式(IIFE)
前端
无名之逆3 小时前
[特殊字符]For Speed Enthusiasts: The Ultimate Evolution of Rust HTTP Engines
开发语言·前端·后端·网络协议·http·rust
巴巴_羊3 小时前
前端八股HTTP和https大全套
前端·http·https
不写八个4 小时前
Express教程【002】:Express监听GET和POST请求
前端·javascript·express
pianmian19 小时前
3D Tiles高级样式设置与条件渲染(3)
linux·服务器·前端
资深前端之路9 小时前
vue+threeJs 绘制3D圆形
前端·javascript·vue.js
Nymph_Zhu10 小时前
vue3+element-plus el-date-picker日期、年份筛选设置本周、本月、近3年等快捷筛选
前端·vue.js·elementui
极客密码10 小时前
DeepSeek-R1-0528,官方的端午节特别献礼
前端·ai编程·deepseek