使用uploadify时修复django csrf错误

时间:2011-04-14 03:11:19

标签: django uploadify django-csrf

我在我的django管理员中使用uploadify但是我收到403错误。当我使用 @csrf_exempt 时,错误消失了,但这是非常危险的。

使用@csrf_exempt装饰器是否有更好的方法可以在不影响管理页面的情况下解决此问题?

提前致谢

3 个答案:

答案 0 :(得分:1)

听起来您或该软件包的原始作者需要更新它以使用CSRF框架中发生的更改。对不起,这不是简单的答案......:/

您需要确保ajax请求正确发送Cookie,更重要的是,您要将CSRF令牌作为发布数据的一部分发送。在CSRF安全补丁之前,ajax请求不需要受CSRF保护,因为我们认为它们不能伪造跨域。不幸的是,事实并非如此,因此我们不得不为这些人提供CSRF令牌。

特别是,请参阅文档的相关部分:

http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

编辑:

看起来uploadify的flash部分不会出于任何原因发送cookie。它之前可能有用,因为它发送的是AJAX标头。现在它需要发送该cookie,因此这里正确的解决方案是修改flash以发送cookie。

答案 1 :(得分:1)

@Paul McMillan我在csrf视图保护方面遇到了同样的问题,并制作了一个小小的&丑陋的解决方法提供基本的csrf验证,这里是代码

from django.views.decorators.csrf import csrf_exempt
from django.middleware.csrf import CsrfViewMiddleware

def check_uploadify_csrf(request):
    return CsrfViewMiddleware().process_view(request, check_uploadify_csrf, None, None) == None

@csrf_exempt
def some_view(request):
    if check_uploadify_csrf(request):
        # do some actions

@ginad我使用uploadify选项formData将csrf令牌发送到后端

formData: {csrfmiddlewaretoken: '{{ csrf_token }}'},

谢谢,

苏丹

答案 2 :(得分:0)

感谢http://blog.fogtunes.com/2009/11/howto-integrate-swfupload-with-django/我能够解决我的问题。

使用Javascript:

function getCookie(cname)
{
var i,x,y,ARRcookies=document.cookie.split(";");
    for (i=0;i<ARRcookies.length;i++)
    {
      x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
      y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
      x=x.replace(/^\s+|\s+$/g,"");
      if(x == cname){
        return unescape(y);
      }
    }
return false;}
  

data = {           sessionid:getCookie('sessionid'),       csrfmiddlewaretoken:csrf_token       }       $( '#file_upload')。uploadify({             //传递cookie和csrftoken             scriptData:数据,             .... //其他代码        });

中间件:

#insert after: 'django.middleware.common.CommonMiddleware'
def process_request(self, request):
    if (request.method == 'POST'):
        if request.POST.has_key('csrfmiddlewaretoken'):
            request.COOKIES["csrftoken"] = request.POST['csrfmiddlewaretoken']
        if request.POST.has_key('sessionid'):
            request.COOKIES['sessionid'] = request.POST['sessionid']

因为uploadify没有传递我需要使用POST传递的cookie,所以在处理视图之前,中间件会设置cookie。