修复使用uploadify时django csrf错误
我在django管理员中使用uploadify,但出现403错误。当我使用@csrf\u export时,错误消失了,但这是非常危险的 通过使用@csrf_-employ decorator,有没有更好的方法在不影响管理页面的情况下修复此问题修复使用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请求不需
提前感谢听起来您或该软件包的原始作者需要对其进行更新,以适应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