PhoneGap中文网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 31|回复: 0

Django的CSRF 保护机制

[复制链接]

54

主题

54

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2017-8-10 15:27:37 | 显示全部楼层 |阅读模式
本文和大家分享的主要是django中的CSRF 保护机制相关内容,一起来看看吧,希望对大家学习django有所帮助。
  什么是 CSRF
  CSRF, Cross Site Request Forgery, 跨站点伪造请求。举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果
  某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,
  你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。
  Django 提供的 CSRF 防护机制
  django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。
  1. 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
  2. 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tagdjango 就会自动帮你生成,见下面)
  3. 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden
  4. 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值。
  Django 里如何使用 CSRF 防护
  1. 要在setting中启用 django.middleware.csrf.CsrfViewMiddleware 这个中间件
QQ截图20170409201802.png
1.启用CsrfViewMiddleware中间件
  1. 在所有的 POST 表单元素时,需要加上一个 {% csrf_token %} tag
 <form method="post" action="{% url 'display:getResult_search' %}" >
    {% csrf_token %}
    ...
</form>
  1. jquery帮我们很好地封装了 ajax ,我们在使用 jquery post 请求时,要在之前加入如下一段 js 代码,用于添加一个 X-CSRFTOKEN header
  <script>
        /*====================django ajax ======*/
        jQuery(document).ajaxSend(function (event, xhr, settings) {
            function getCookie(name) {
                var cookieValue = null;
                if (document.cookie && document.cookie != '') {
                    var cookies = document.cookie.split(';');
                    for (var i = 0; i < cookies.length; i++) {
                        var cookie = jQuery.trim(cookies);
                        // Does this cookie string begin with the name we want?
                        if (cookie.substring(0, name.length + 1) == (name + '=')) {
                            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                            break;
                        }
                    }
                }
                return cookieValue;
            }
            function sameOrigin(url) {
                // url could be relative or scheme relative or absolute
                var host = document.location.host; // host + port
                var protocol = document.location.protocol;
                var sr_origin = '//' + host;
                var origin = protocol + sr_origin;
                // Allow absolute or scheme relative URLs to same origin
                return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
                    (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
                    // or any other URL that isn't scheme relative or absolute i.e relative.
                    !(/^(\/\/|http:|https:).*/.test(url));
            }
            function safeMethod(method) {
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }
            if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
                xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
            }
        });
        /*===============================django ajax end===*/
</script>
来源:简书

it营
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|PhoneGap中文网 ( 京ICP备13027796号-1

GMT+8, 2017-8-22 01:36 , Processed in 0.303751 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表