什么是 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 请求,且会发生页面跳转的请求所使用。

相关推荐
子兮曰9 分钟前
🔥深度解析:Nginx目录浏览美化与功能增强实战指南
前端·javascript·nginx
machinecat9 分钟前
node,小程序合成音频的方式
前端·node.js
我是日安11 分钟前
从零到一打造 Vue3 响应式系统 Day 4 - 核心概念:收集依赖、触发更新
前端·vue.js
跟橙姐学代码11 分钟前
不要再用 print() 了!Python logging 库才是调试的终极武器
前端·python
ze_juejin14 分钟前
JavaScript 中预防 XSS(跨站脚本攻击)
前端
我是天龙_绍15 分钟前
🐴 记住了,节流(throttle)与防抖(debounce)
前端
凡二人17 分钟前
Flip-js 优雅的处理元素结构变化的动画(解读)
前端·typescript
争当第一摸鱼前端18 分钟前
Electron中的下载操作
前端
sjin29 分钟前
React 源码 - Commit Phase 的工作细节
前端
FisherYu31 分钟前
AI环境搭建pytorch+yolo8搭建
前端·计算机视觉