我在我的 django 管理员中使用 uploadify,但出现 403 错误。当我使用@csrf_exempt时,错误消失了,但这非常危险。
使用@csrf_exempt 装饰器有没有更好的方法来解决这个问题而不影响管理页面?
提前致谢
我在我的 django 管理员中使用 uploadify,但出现 403 错误。当我使用@csrf_exempt时,错误消失了,但这非常危险。
使用@csrf_exempt 装饰器有没有更好的方法来解决这个问题而不影响管理页面?
提前致谢
@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 }}'},
谢谢,
苏丹
听起来您或该软件包的原始作者都需要对其进行更新以适应 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。
感谢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。