CSRF 特点
-
CSRF:Cross Site Request Forgery 跨站请求伪造;
-
本质是👉 恶意网站把 正常用户 作为 媒介 ,通过模拟正常用户的操作,攻击其 登录过 的站点;
CSRF 原理
-
用户访问正常站点,登录后获取到了正常站点的令牌,以 cookie 的形式保存
-
用户访问恶意站点,恶意站点通过某种形式去请求了正常站点(请求伪造),迫使正常用户把令牌传递到正常站点,完成攻击
防御
cookie 的 SameSite
现在很多浏览器都支持 禁止跨域附带的 cookie ,只需要把 cookie 设置的
SameSite
设置为Strict
即可;
SameSite
有以下取值:
- Strict:严格,所有跨站请求都不附带 cookie,有时会导致用户体验不好(超链接等)
- Lax:宽松,所有跨站的 超链接、GET 请求的表单、预加载连接时会发送 cookie ,其他情况不发送
- None:无限制
这种方法非常简单,极其有效,但前提条件是:用户不能使用太旧的浏览器
验证 referer 和 Origin
页面中的二次请求都会附带 referer 或 Origin 请求头,向服务器表示该请求来自于哪个源或页面,服务器可以通过这个头进行验证;
但某些浏览器的 referer 是可以被用户禁止的,尽管这种情况极少;
使用非 cookie 令牌
这种做法是要求每次请求需要在请求体或请求头中附带 token
请求的时候:
authorization: token
,不用 cookie 的方式携带 token 了
验证码
这种做法是要求每个要防止 CSRF 的请求都必须要附带验证码
不好的地方是容易把正常的用户逼疯
表单随机数
这种做法是服务端渲染时,生成一个随机数,客户端提交时要提交这个随机数,然后服务器端进行对比,该随机数是一次性的
流程:
- 客户端请求服务器,请求添加学生的页面,传递 cookie
- 服务器:生成一个随机数放到 session 中,生成页面时,表单中加入一个隐藏的表单域
<input type="hidden" name="hash" value="<%=session['key'] %>">
- 填写好信息后,提交表单,会自动提交隐藏的随机数
- 服务器:先拿到 cookie 判断是否登录过,对比提交过来的随机数和之前的随机数是否一致,清除掉 session 中的随机数
二次验证
当做出敏感操作时,进行二次验证
面试题
介绍 CSRF 攻击
CSRF 是跨站请求伪造,是一种挟制用户在当前已登录的 Web 应用上执行非本意的操作的攻击方法;
它首先引导用户访问一个危险网站,当用户访问网站后,网站会发送请求到被攻击的站点,这次请求会携带用户的 cookie 发送,因此就利用了用户的身份信息完成攻击;
防御 CSRF 攻击有多种手段:
- cookie 中使用 sameSite 字段;
- 验证 referer 和 Origin 字段;
- 使用非 cookie 令牌;
- 验证码;
- 表单随机数;
- 二次验证;
TypeScript👉 项目实战-开发俄罗斯方块
上一篇