Django跨站伪造请求保护措施设置方法

        注:以下内容转载自 Django跨站伪造请求保护措施设置方法 一文,仅供学习使用。

        在 Django 建站中遇到 POST 提交表单提示 403 错误,发现以 POST 方式提交表单会触发 Django 内置的 csrf 保护机制,并且在 403 页面给出了解决方法,根据提示更改后发现问题依旧,网上查阅很多同学的解决方案均不能解决这个问题,所以到官网上查阅了关于csrf部分的具体设置,最后成功解决了这个问题。

        官方csrf部分设置翻译:

        CSRF设置步骤:

        第一步:在 settings.py 中的 MIDDLEWARE_CLASSES 部分添加'django.middleware.csrf.CsrfViewMiddleware',如果使用普通方式创建的 Django 项目,这一项一般都已经存在了不用额外设置。如果你不希望加入 csrf 的中间件,那么可以在 views 中的方法上加上 csrf_protect() 装饰器方法,这一步不是必须设置的,网上有很多人都在启用了中间件的同时也加上了 csrf_protect() 方法,导致问题依旧,官方文档上明确写到了这一步是【Alternatively】。

        第二步:在 POST 表单的 template 中加入 csrf_token。这一步很简单,在模板中添加如下代码:

{% csrf_token %}
        需要注意的一点是,表单提交路径如果是外部链接则不需要添加 csrf token 。

        第三步:在请求处理方法中添加 context processor。

        这一步有两种方式实现:

        方法1:使用 RequestContext,RequestContext 始终都使用了'django.core.context_processors.csrf'。If you are using generic views or contrib apps, you are covered already, since these apps use RequestContext throughout.(这一段还没搞明白,大致意思猜想是普通views或内置的contrib下的应用时,那么已经使用了这种方式来处理 csrf 请求了,不需要额外处理了)

        方法2:手动添加 csrf 处理(我使用的这一种能成功访问)。示例代码如下:

from django.core.context_processors import csrf  
from django.shortcuts import render_to_response  
  
def my_view(request):  
    c = {}  
    c.update(csrf(request))  
    # ... view code here  
    return render_to_response("a_template.html", c) 

        在第一次按照自己的设想将如上代码加入到 view 中时,发现问题依旧,后来将前两行代码放置在方法开始位置后,成功解决问题,由此推测该示例代码的前两行只能放在第一次使用 request 对象之前。

        Django 中使用 Ajax 请求的 CSRF 设置:

        将官方文档上的 ajax 设置照搬下来:

    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[i]);  
                // 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;  
    }  
    var csrftoken = getCookie('csrftoken');  
      
    function csrfSafeMethod(method) {  
        // these HTTP methods do not require CSRF protection  
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));  
    }  
    $.ajaxSetup({  
        crossDomain: false, // obviates need for sameOrigin test  
        beforeSend: function(xhr, settings) {  
            if (!csrfSafeMethod(settings.type)) {  
                xhr.setRequestHeader("X-CSRFToken", csrftoken);  
            }  
        }  
    });  

        这里使用的是 jQuery,于是可以使用 jQuery 来正常发送 ajax 请求,如:

    $(document).ready(function(){  
            $("#postBtn").click(function(){  
                $.post('/ajax/aPost/', {id:'0001'}, function(data){  
                     alert(data);  
                })  
            });  
        }  
    );  

        GET 请求就不赘述了,同理,本文主要问题在于设置 csrf 说明,使用 Django版本为1.4.3,jQuery版本为1.8.0

你可能感兴趣的:(Django)