跨站攻击和利用CSRF token来防御

版权声明:本文为博主原创文章,可以转载但必须注明出处。 https://blog.csdn.net/nirendao/article/details/80699062

跨站攻击:

  1. 用户首先访问网银站点,登录成功后,浏览器拿到token
  2. 用户并没有登出网银站点,此时又登录一个钓鱼站点
  3. 钓鱼站点有一个诱惑链接,用户点了此链接,此链接的内容是一个URL,而此URL的实质就是转账给钓鱼者,用的是网银的标准转账URL.
  4. 用户点此链接后,浏览器封装HTTP请求,当看见是访问那个尚未退出的网银站点,就自动加上了cookie与auth token
  5. 于是,authentication通过,就会真的转账了

同源策略:
A网页设置的Cookie,B网页不能打开,除非AB同源。同源指的是:协议相同,域名相同,端口相同。

CSRF token防止跨站攻击:

  1. 在cookie中放置csrftoken,一个随机串
  2. 网银网站的网页源码中会将该串同时也放置到提交表单的隐藏域
  3. 网银网站后端会比较cookie中的csrftoken和表单中的隐藏域,若一致,则通过验证
  4. 对于钓鱼网站来说,因为同源策略,它无法获取到网银网站的cookie,只能是利用浏览器封装HTTP请求的时候把网银网站的cookie一起封进去;
    但是因为它无法读取cookie,所以无法伪造一个表单,在其中的隐藏域中填写和cookie中csrftoken一样的值。因此,它无法通过验证。

以Django为例,说明如何使用CSRF token防止跨站攻击:

  1. 在Django的配置文件中,如settings.py,找到 MIDDLEWARE_CLASSES 这一项,使能其中的 django.middleware.csrf.CsrfViewMiddleware
  2. 使能以上这一项后,就相当于使用了 CsrfViewMiddleware 这个类,尤其是其中的 process_view()函数。这个类一般在csrf.py中。
    process_view()函数会比较HTTP request中的cookie里的CSRF token 和 头部的 X-CSRFTOKEN 是否相同。若不相同,则相当于检测失败,有跨站攻击的危险。
    因此,这也要求前端在提交HTTP request的时候,需要在其中添加Header字段 X-CSRFTOKEN,其值需从cookie中取得以保证一致。

猜你喜欢

转载自blog.csdn.net/nirendao/article/details/80699062