面试题之 CSRF 攻击

305 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

定义

  • 跨站点请求伪造(Cross-Site Request Forgeries),在用户不知情的情况下,冒充用户发起请求, 完成一些违背用户意愿的事情,比如修改用户信息,删评论等(如果找到 XSS 漏洞,可以用一些 JS 去借用用户的身份去发出请求)或者是伪造请求完成服务器的一些 CURD 操作
  • CSRF 可以说是钓鱼网站的应用,常见于用户的 cookie 被利用

触发方式

写一个钓鱼网站

  1. 里面放上一个 img 标签,设置为不可见,src 属性设置为有 CSRF 漏洞的接口,当用户访问这个钓鱼网站的时候浏览器会根据 img 标签请求 src 中的 url

防御方式

  1. 验证码;强制用户必须与应用进行交互,才能完成最终请求。
  2. 尽量使用 post ,限制 get 请求;get 很容易被拿来做 csrf 攻击;
  3. 通过 header 中的 referer 字段,做请求来源限制,设置只能由特定页面调用接口,能够防止自己伪造请求的 CSRF,也可以防止通过用户自身发出伪造请求的 CSRF,此种方法成本最低,但是并不能保证 100% 有效,因为服务器并不是什么时候都能取到 Referer,而且低版本的浏览器存在伪造 Referer 的风险
  4. 其实抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,所以现在大多数的方案是使用的 token,token 的防御机制是公认最合适的方案

token 原理

使用 token 的原理:

  1. 第一步:后端随机产生一个 token,把这个token 保存到后端的这个 session 状态中;同时后端把这个token 发给前端页面;
  2. 第二步:前端页面提交请求时,把 token 加入到请求体 body 或者自定义 HTTP 请求头里面,比如 Authorization,一起传给后端,这个 token 是不能放在 cookie 里面,放在 cookie 里面就有可能被黑客利用,就失去了用 token 的意义
  3. 后端验证前端传来的 token 与 session 是否一致,一致则合法,否则是非法请求,没有就是伪造的