2

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

使用@csrf_exempt 装饰器有没有更好的方法来解决这个问题而不影响管理页面?

提前致谢

4

3 回答 3

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 }}'},

谢谢,

苏丹

于 2012-06-04T07:35:04.183 回答
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。

于 2011-04-14T05:25:17.600 回答
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 : data, .... // 其他代码 });

中间件:

#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没有传递cookie我需要使用POST传递它,然后在处理视图之前中间件将设置cookie。

于 2011-04-15T05:19:43.127 回答