Исправление ошибки django csrf при использовании uploadify - PullRequest
2 голосов
/ 14 апреля 2011

Я использую uploadify в моем администраторе django, но получаю ошибку 403. Когда я использую @ csrf_exempt , ошибка исчезает, но это очень рискованно.

Есть ли лучший способ исправить эту проблему, не ставя под угрозу страницу администратора, используя @csrf_exempt decorator?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 04 июня 2012

@ Пол МакМиллан: Я столкнулся с той же проблемой с защитой 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 Я использовал опцию загрузки formData для отправки токена csrf бэкенду

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

Спасибо

Sultan

1 голос
/ 14 апреля 2011

Похоже, вам или первоначальному автору этого пакета необходимо обновить его, чтобы он работал с изменениями, внесенными в среду CSRF. Извините, это не простой ответ ...: /

Вам необходимо убедиться, что запросы ajax отправляют файлы cookie правильно, и, что более важно, вы отправляете токен CSRF как часть опубликованных данных. До исправления безопасности CSRF запросы ajax не обязательно были защищены CSRF, потому что мы полагали, что они не могут быть поддельными междоменными. К сожалению, это не так, поэтому нам также потребовались токены CSRF.

В частности, см. Соответствующую часть документов:

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

Edit:

Похоже, что флэш-часть uploadify не отправляет куки по какой-либо причине. Вероятно, раньше он работал, потому что отправлял заголовок AJAX. Теперь он должен отправлять этот cookie независимо, поэтому правильное решение здесь - изменить флэш-память для отправки cookie.

0 голосов
/ 15 апреля 2011

Благодаря 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;}

данные = { sessionid: getCookie ('sessionid'), csrfmiddlewaretoken: csrf_token } $ ( '# File_upload'). Uploadify ({ // передать куки и csrftoken scriptData: данные, .... // другие коды });

Middleware:

#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.

...