CSRF 攻击指的是跨站请求伪造攻击,攻击者诱导用户进入一个第三 方网站,然后该网站向被攻击网站发送跨站请求。
引起原因
利用cookie会在同源请求中携带并发送给服务器的特点,实现用户冒充
攻击方式
- GET请求攻击:在网站的某一个可见标签里面构建请求,当用户打开页面的时候自动触发
- POST请求攻击:构建一个表单但是隐藏起来,用户进入页面的时候,自动提交表单
- A标签请求攻击:在a标签的href里面构建请求,诱导用户去点击触发
防范方式
CSRF的特点就是一般发生在三方域名,并且是只能使用用户的cookie但是并不能获取到这些信息。
- 阻止不明外域的访问
- 同源检测:判断请求是否来自外域,如果来自外域则拒绝请求。【一般在请求头上加上origin header/referer header】
- origin heade:表示请求的来源,如果存在直接确定来源域名就可以
- 302重定向origin不存在,因为302重定向是定向到新的服务器上的URL上面,浏览器不想将Origin泄漏
- IE11没有origin同源,唯一标识还是referer
- referer:记录HTTP的请求地址,但是可能会暴露用户的浏览历史,涉及到用户的隐私问题。【所以这个并不是万无一失的,攻击者可以随意更改自己的referer,或者隐藏起来】
- 协议表示为本地文件的file或者data不会携带
- 当前请求页面采用的是非安全协议,而来源页面采用的是安全协议(HTTPS)。
- 如果referer和origin都不存在 那么就会直接进行阻止。
- origin heade:表示请求的来源,如果存在直接确定来源域名就可以
- Samesite Cookie:Set-Cookie响应头新增Samesite属性,它用来标明这个 Cookie是个“同站 Cookie”,同站Cookie只能作为第一方Cookie,不能作为第三方Cookie
- strict: 严格模式, 只会在第一方上下文中发送,不会与第三方网站发起的请求一起发送
- lax:宽松模式,允许与顶级导航一起发送,并将与第三方网站发起的 GET 请求一起发送。这是浏览器中的默认值。
- 同源检测:判断请求是否来自外域,如果来自外域则拒绝请求。【一般在请求头上加上origin header/referer header】
- 提交时要求附加本域才能获取的信息
- CSRF Token 【生成唯一的token,拿到服务端进行校验】
- 将CSRF Token输出到页面中
- 页面提交的请求携带这个Token
- 服务器验证Token是否正确
- 双重Cookie验证
- 在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串
- 在前端向后端发起请求时,取出Cookie,并添加到URL的参数中
- 后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。