CSRF 特点

  1. CSRFCross Site Request Forgery 跨站请求伪造;

  2. 本质是👉 恶意网站把 正常用户 作为 媒介 ,通过模拟正常用户的操作,攻击其 登录过 的站点;

CSRF 原理

  1. 用户访问正常站点,登录后获取到了正常站点的令牌,以 cookie 的形式保存

  2. 用户访问恶意站点,恶意站点通过某种形式去请求了正常站点(请求伪造),迫使正常用户把令牌传递到正常站点,完成攻击

防御

  1. 现在很多浏览器都支持 禁止跨域附带的 cookie ,只需要把 cookie 设置的 SameSite 设置为 Strict 即可;

  2. SameSite有以下取值:

    • Strict:严格,所有跨站请求都不附带 cookie,有时会导致用户体验不好(超链接等)
    • Lax:宽松,所有跨站的 超链接GET 请求的表单、预加载连接时会发送 cookie ,其他情况不发送
    • None:无限制
  3. 这种方法非常简单,极其有效,但前提条件是:用户不能使用太旧的浏览器

验证 referer 和 Origin

  1. 页面中的二次请求都会附带 refererOrigin 请求头,向服务器表示该请求来自于哪个源或页面,服务器可以通过这个头进行验证;

  2. 但某些浏览器的 referer 是可以被用户禁止的,尽管这种情况极少;

  1. 这种做法是要求每次请求需要在请求体或请求头中附带 token

  2. 请求的时候:authorization: token,不用 cookie 的方式携带 token

验证码

  1. 这种做法是要求每个要防止 CSRF 的请求都必须要附带验证码

  2. 不好的地方是容易把正常的用户逼疯

表单随机数

  1. 这种做法是服务端渲染时,生成一个随机数,客户端提交时要提交这个随机数,然后服务器端进行对比,该随机数是一次性的

  2. 流程:

    • 客户端请求服务器,请求添加学生的页面,传递 cookie
    • 服务器:生成一个随机数放到 session 中,生成页面时,表单中加入一个隐藏的表单域
      <input type="hidden" name="hash" value="<%=session['key'] %>">
    • 填写好信息后,提交表单,会自动提交隐藏的随机数
    • 服务器:先拿到 cookie 判断是否登录过,对比提交过来的随机数和之前的随机数是否一致,清除掉 session 中的随机数

二次验证

当做出敏感操作时,进行二次验证

面试题

介绍 CSRF 攻击

  1. CSRF 是跨站请求伪造,是一种挟制用户在当前已登录的 Web 应用上执行非本意的操作的攻击方法;

  2. 它首先引导用户访问一个危险网站,当用户访问网站后,网站会发送请求到被攻击的站点,这次请求会携带用户的 cookie 发送,因此就利用了用户的身份信息完成攻击;

  3. 防御 CSRF 攻击有多种手段:

    • cookie 中使用 sameSite 字段;
    • 验证 refererOrigin 字段;
    • 使用非 cookie 令牌;
    • 验证码;
    • 表单随机数;
    • 二次验证;
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. CSRF 特点
  2. 2. CSRF 原理
  3. 3. 防御
    1. 3.1. cookie 的 SameSite
    2. 3.2. 验证 referer 和 Origin
    3. 3.3. 使用非 cookie 令牌
    4. 3.4. 验证码
    5. 3.5. 表单随机数
    6. 3.6. 二次验证
  4. 4. 面试题
    1. 4.1. 介绍 CSRF 攻击