CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
一个经典的CSRF请求
- 受害者登录了a.com,并保留了登录凭证
cookie
- 攻击者引诱受害者访问了
b.com
b.com
向a.com
发送了一个请求a.com
接收到请求后,对请求进行验证,确定是受害者的凭证,误以为是受害者自己发送的请求a.com
以受害者的名义执行b.com
发送过来的请求- 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让
a.com
执行了自己定义的操作
防护策略
- 同源检测 因为多数CSRF来自第三方网站,那我们就直接禁止外域对我们发起请求,比如我们可以验证其
Referer
和Origin
- SameSite Cookie 该属性有服务端设置,外站不可以使用本站的Cookie。SameSite分为Strict和Lax两种模式,Strict表明Cookie任何情况下都不能作为第三方Cookie,Lax模式下,如果这个请求改变了当前页面或者打开了新页面且同时是个GET请求,这个Cookie就可以作为第三方的Cookie
- CSRF Token 将CSRFtoken输出到页面中,页面提交请求时携带这个token,服务器验证token是否正确
- 双重Cookie认证 在用户访问网站页面时,向请求域名注入一个
cookie
,内容为随机字符串。在前端向后端发起请求时,取出Cookie,并拼接到URL中。后端接口验证Cookie中的字段与URL中的字段是否一致,不一致则拒绝