csrf

CSRF(Cross-site request forgery),中文为‘跨域站点伪造’;

Posted by nolan on November 12, 2019

什么是 csrf 攻击?

  • CSRF(Cross-site request forgery),中文为‘跨域站点伪造’;

攻击流程

  • 用户 A、 网站 B、攻击网站 C
  • 流程:

    1. A 登录 网站 B,A 的浏览器有了网站 B 设置的身份认证的 cookie 信息;
    1. A 在没有登出 B 的情况下访问了攻击网站 C, C 网站上的恶意脚本对网站 B 的后台发出恶意操作请求;
    1. A 的浏览器会带着 A 的 cookie 信息去对 B 的后台发出请求,这样,攻击者就绕过了身份认证。

原理

  • Web 的隐式身份验证机制:
  • Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。

防御

  • 尽量用 post 代替 get 请求;

  • GET接口太容易被拿来做CSRF攻击,只要构造一个img标签,而img标签又是不能过滤的数据。 接口最好限制为POST使用,降低攻击风险。

    缺点: 当然POST并不是万无一失,攻击者只要构造一个form就可以, 但需要在第三方页面做,这样就增加暴露的可能性。

  • Referer 检查

  • Referer Check在Web最常见的应用就是“防止图片盗链”。 同理,Referer Check也可以被用于检查请求是否来自合法的“源”。 如果都不是,那么就极可能是CSRF攻击。

    缺点: 服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。

  • CSRF token

  • 服务器在用户浏览器生成一个随机数字 csrfkey 的 cookie,并存在用户的服务器 session 信息中;
  • 用户每次在发送请求前,利用和后台约定的算法,以 csrfkey 为种子生成一个token(csrf token);
  • 发送请求时将这个 csrftoken 作为一个 querystring 参数传给后台,后台根据算法校验 csrftoken 是否合法

    缺点: 若存在xss 漏洞,攻击者可以拿到 cookie 中的 csrfkey,并可能找到 js 中的加密算法生成合法的 csrftoken

【JWT】JSON Web Token

  • 验证码

  • 每次提交表单都要用户输入一个验证码进行验证。