美文网首页
Django 之ajax请求中的跨站请求攻击

Django 之ajax请求中的跨站请求攻击

作者: Cluas | 来源:发表于2017-09-02 19:50 被阅读255次

    背景介绍

    • 在网站开发过程中可能会需要用到ajax来达到不刷新网页就更新局部html。
      django的模版便签里自带里一个{% csrf_token %} 来防止跨站请求攻击,在CSRF保护激活的情况下, Django 会检查所有 POST 请求中的 CSRF token。
      当你提交表单时,你可以使用{% csrf_token %}模板标签来发送带有 token 的表单。
      Any way,像 POST 请求一样对 AJAX 请求传递CDRF token 可能会有一点点不方便。
      当发起AJAX请求的时候,如果我们没带上请求头,我们会直接拒绝访问,为了解决一个问题,查文档后发现了可行的解决方案。

    解决方案

    • 其实Django允许你在你的 AJAX 请求中设置一个定制的 X-CSRFToken token 头(header)。这允许你安装一个 jQuery 或者任意 JavaScript 库来自动设置X-CSRFToken头在每一次请求中。
      为了在所有的请求中加入 token ,你需要:

      1. 从 csrftoken cookie 中检索 CSRF token,它在CSRF保护激活的情况下会被设置
      2. 使用 X-CSRFToken头发送 token 到 AJAX 中
        你也可以自己去文档里找到更多关于 CSRF 保护 和 AJAX 的信息:http://docs.djangoproject.com/en/1.11/ref/csrf/#ajax
    • 为了实现上述需求我们需要编写代码如下类似代码

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/
    jquery.min.js"></script>
    <script src=" http://cdn.jsdelivr.net/jquery.cookie/3.2.1/jquery.
    cookie.min.js "></script>//   获取一个cookie相关的包
    <script>
      var csrftoken = $.cookie('csrftoken');  // 获取cookie里的token 赋值给这个变量
      function csrfSafeMethod(method) {
        // 这里的这些方法不需要csrf保护
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
      beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
          xhr.setRequestHeader("X-CSRFToken", csrftoken); //设置我们的主人公,请求头
      }
    }
    });
    $(document).ready(function(){
        {% block domready %} // 我们把这段代码写在网站的base模版下,哪有就可以让所以模版自由使用带请求头的ajax请求
        {% endblock %}
      });
    </script>
    
    • 把这段代码写到网站及base模版里,接下来就可以自由的使用带请求头ajax请求啦

    好啦 又是Happycoding时光~

    相关文章

      网友评论

          本文标题:Django 之ajax请求中的跨站请求攻击

          本文链接:https://www.haomeiwen.com/subject/aqmrjxtx.html