# 详解csrf(跨站请求伪造)

1.什么是csrf (csrf攻击原理)?

  1. 用户正常访问A网站,A网站设置cookie被用户浏览器保存
  2. 用户不关闭浏览器,直接访问恶意网站,该恶意网站内隐藏式内嵌了A网站接口的请求链接
  3. 触发该请求链接,自动携带浏览器保存的cookie,请求成功。

2.涉及的基础知识

我们先梳理下上面所涉及的一些基础知识。

1.Cookie

因为http请求是无状态的,他不能保存任何信息,但在很多场景下,都需要保存状态,因此就出现了cookie。后端通过set-cookie,浏览器就会将该cookie进行保存,当再次请求该服务器时,会自动携带cookie,针对于cookie有几个需要注意的地方。

  1. cookie是浏览器自动携带的,只要请求该服务器就会携带上该服务器域名下保存的cookie

    这也是为什么第三方网站代码中内嵌了请求服务器的链接后,访问该链接会自动携带浏览器保存的cookie。

  2. 通过使用js对cookie的读写操作是有限制的,需要是和服务器同域名

    在无登录页的项目中,可以利用这条规则,使用js读取浏览器保存的cookie,然后和后端协商截取cookie一部分作为csrf-token,后端接收到请求后使用相同的截取规则截取cookie和请求头中的csrf对比,判断是否一致。

2.浏览器的同源策略限制

MDN:同源策略是一个重要的安全策略,它用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互。

如果协议(http,https..),主机,端口号都相同,就是同源,同源策略属于浏览器的行为策略,这也意味着如果你访问的接口跨域了,这个请求就不会到达接口服务器,在浏览器就被截获了。

举个例子:a.html部署在mdd.com:8080/a.html上,在a中访问了接口b,接口b为mdd2.com:8080/getinfo ,a和b的主机号不相同,这样就算是跨域

同源策略?
  • 使用xhr(axios,ajax)等获取网络资源的会触发同源策略
  • 使用script,img,link等标签加载资源不受同源策略限制,有些恶意网站就是在这类标签的链接地址中发起发起请求。

3.csrf预防方案

1. Referert头部校验

csrf主要是第三方网站拿着浏览器保存的cookie去访问服务器,如果我们告诉服务器发起请求的页面地址,让服务器判断是否为第三方网站是否需要给其访问权限是不是就可以了。这就使用到了http头中的referert字段 ,这个字段标识了发送请求的客户端地址,后端可以通过白名单等方式对请求进行限制。

2.csrf-token(推荐)

在登录页登录成功后,后端返回一个csrf-token,将该值保存起来,后面的请求前端都将这个token放的请求头中,后端只需要对该值进行校验。

3.SameSite属性

SameSite是专门为解决csrf增加的http头部属性字段,该属性有三个属性值

  • samesite=none

  • samesit=lax

    宽松模式,允许部分第三方网站请求携带cookie

    • a,link标签
    • get读取请求
  • samesit=strict

    严格模式,在任何情况下都不会被第三方网站链接携带

参考文章:

  1. developer.mozilla.org/zh-CN/docs/...
  2. blog.csdn.net/weixin_5912...
  3. www.cnblogs.com/ziyunfei/p/...
相关推荐
被制作时长两年半的个人练习生2 小时前
近期的笔试和面试的复盘
算法·面试·职场和发展·算子
爱吃KFC的大肥羊3 小时前
第二次面试:C++qt开发实习生
面试·职场和发展
GL-Yang3 小时前
2025年-集合类面试题
java·面试
黄昏恋慕黎明3 小时前
JVM虚拟机(面试重)
jvm·面试·职场和发展
-睡到自然醒~3 小时前
[go 面试] 并发与数据一致性:事务的保障
数据库·面试·golang
Dolphin_海豚4 小时前
@vue/reactivity
前端·vue.js·面试
怪兽20144 小时前
请谈谈什么是同步屏障?
android·面试
尘世中一位迷途小书童4 小时前
版本管理实战:Changeset 工作流完全指南(含中英文对照)
前端·面试·架构
吃饺子不吃馅4 小时前
【八股汇总,背就完事】这一次再也不怕webpack面试了
前端·面试·webpack
渣哥6 小时前
当容器里有多个 Bean,@Qualifier 如何精准定位?
javascript·后端·面试