Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修复使用uploadify时django csrf错误_Django_Uploadify_Django Csrf - Fatal编程技术网

修复使用uploadify时django csrf错误

修复使用uploadify时django csrf错误,django,uploadify,django-csrf,Django,Uploadify,Django Csrf,我在django管理员中使用uploadify,但出现403错误。当我使用@csrf\u export时,错误消失了,但这是非常危险的 通过使用@csrf_-employ decorator,有没有更好的方法在不影响管理页面的情况下修复此问题 提前感谢听起来您或该软件包的原始作者需要对其进行更新,以适应CSRF框架中的更改。对不起,这不是一个简单的答案/ 您需要确保ajax请求正确发送cookie,更重要的是,您将CSRF令牌作为发布数据的一部分发送。在使用CSRF安全补丁之前,ajax请求不需

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

通过使用@csrf_-employ decorator,有没有更好的方法在不影响管理页面的情况下修复此问题


提前感谢

听起来您或该软件包的原始作者需要对其进行更新,以适应CSRF框架中的更改。对不起,这不是一个简单的答案/

您需要确保ajax请求正确发送cookie,更重要的是,您将CSRF令牌作为发布数据的一部分发送。在使用CSRF安全补丁之前,ajax请求不需要CSRF保护,因为我们认为它们不能跨域伪造。不幸的是,这不是真的,因此我们也需要CSRF令牌

具体请参见文档的相关部分:

编辑:

看起来uploadify的flash部分不会出于任何原因发送cookies。它以前可能工作过,因为它发送了一个AJAX头。现在不管怎样,它都需要发送cookie,因此正确的解决方案是修改flash以发送cookie。

多亏我能够解决我的问题

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;}

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

@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 I使用uploadify选项
formData
将csrf令牌发送到后端

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

谢谢


Sultan

谢谢paul,但是uploadify并没有用ajax发送数据。数据是使用多部分post发送的。您实际上已经禁用了CSRF保护。这与将表单设置为CSRF豁免完全相同。这种保护依赖于这样一个事实:恶意站点不能在您的域上的浏览器中设置cookie。你巧妙地绕过了这一点。听起来uploadify的flash组件没有发送正确的cookie。这就是应该修复的地方。如果直接检查csrfmiddlewaretoken和session_id的正确值会怎么样?主要问题是Djangos CSRF保护依赖于CSRF cookie,而uploadify不会传递cookie。但是它可以通过scriptData传递csrfmiddlewaretoken和会话id的值。它会不会保留CSRF保护,告诉Django不要查找CSRF cookie,而是查找request.POST中的相关值?我本质上想说的是:不要盲目地设置“cookie”,而是在检查重要值(csrfmiddlewaretoken、sessionid,还有什么?)。我认为这是可行的,尽管我不确定我是否完全理解csrf保护机制……尽管保罗指出了这个问题的原因,但他没有提出解决方案。对于任何使用Django和jQuery的人来说,更详细地了解这个主题是很有趣的,因为不是每个人都有时间学习actionscript。@ginad我有一个类似的问题,但不同。我一直在尝试发送令牌,并使用@sultan的黑客解决方案进行验证,但它对我无效。这个问题已经三年了,而且肯定是基于Django的旧版本。然而,我查看了
CsrfViewMiddleware
源代码,看到的情况让我认为通过
formData
发送令牌并尝试从Django验证它是不够安全的。也许我现在太困惑了,但可能实现完全安全性的唯一方法是调整
uploadify.swf
本身…我尝试了相同的解决方案,但是
check\u uploadify\u csrf()
函数导入到
views.py
中,而不是在内部定义它。如果函数返回某些内容,我的代码会故意触发
HttpResponseForbidden()
。但是,我可以清楚地看到,
formData
正在通过POST成功地将令牌发送到Django服务器,所以我不明白为什么
check\u uploadify\u csrf()。。。似乎中间件将研究
request.META['CSRF\u COOKIE']
。。。这是否意味着仅仅发送cookie的令牌来防止CSRF攻击是不够的,但整个cookie本身必须通过HTTP请求中的元数据发送?这是否意味着解决这个问题的唯一方法就是修改uploadify.swf
本身来发送cookie,而没有其他方法可以像@PaulMcMillan所说的那样授予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