定义
- 跨站点请求伪造(
Cross-Site Request Forgeries
),在用户不知情的情况下,冒充用户发起请求, 完成一些违背用户意愿的事情,比如修改用户信息,删评论等(如果找到XSS
漏洞,可以用一些JS
去借用用户的身份去发出请求)或者是伪造请求完成服务器的一些CURD
操作 CSRF
可以说是钓鱼网站的应用,常见于用户的cookie
被利用
触发方式
写一个钓鱼网站
- 里面放上一个
img
标签,设置为不可见,src
属性设置为有CSRF
漏洞的接口,当用户访问这个钓鱼网站的时候浏览器会根据img
标签请求src
中的url
防御方式
- 验证码;强制用户必须与应用进行交互,才能完成最终请求。
- 尽量使用 post ,限制 get 请求;get 很容易被拿来做 csrf 攻击;
- 通过 header 中的 referer 字段,做请求来源限制,设置只能由特定页面调用接口,能够防止自己伪造请求的 CSRF,也可以防止通过用户自身发出伪造请求的 CSRF,此种方法成本最低,但是并不能保证 100% 有效,因为服务器并不是什么时候都能取到 Referer,而且低版本的浏览器存在伪造 Referer 的风险
- 其实抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,所以现在大多数的方案是使用的 token,token 的防御机制是公认最合适的方案
token 原理
使用 token
的原理:
- 第一步:后端随机产生一个 token,把这个token 保存到后端的这个 session 状态中;同时后端把这个token 发给前端页面;
- 第二步:前端页面提交请求时,把 token 加入到请求体 body 或者自定义 HTTP 请求头里面,比如 Authorization,一起传给后端,这个 token 是不能放在 cookie 里面,放在 cookie 里面就有可能被黑客利用,就失去了用 token 的意义
- 后端验证前端传来的 token 与 session 是否一致,一致则合法,否则是非法请求,没有就是伪造的