Джанго: CSRF с AJAX - PullRequest
       27

Джанго: CSRF с AJAX

0 голосов
/ 30 сентября 2011

У меня есть проблема / ошибка найдена? в AJAX с CSRF. Я не использую {% csrf_token %} вообще. Я использую только формы AJAX, поэтому для csrf не задан файл cookie. В этом случае - введите описание ссылки здесь бесполезно :( Я могу использовать get_token для его генерации, но я должен разместить его на всех своих сайтах, чтобы он не имел смысла.

Как я могу создать этот файл cookie без использования тега csrf?

Ответы [ 4 ]

1 голос
/ 24 января 2014

Любая случайная 32-значная буквенно-цифровая строка будет работать как токен. Просто сохраните его в файле cookie с именем «csrftoken» и отправьте вместе со своим сообщением.

Это автоматически сгенерирует токен или повторно использует существующий. Он будет обрабатывать все отправленные формы на странице. Если у вас есть сторонние формы, вам нужно убедиться, что они не запускают этот код.

<script>
$(document).on('submit', 'form[method=post]', function(){
  if(!document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')){
    for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
    document.cookie = 'csrftoken=' + c + '; path=/'
  }
  if(!this.csrfmiddlewaretoken) $(this).append('<input type="hidden" name="csrfmiddlewaretoken">')
  $(this.csrfmiddlewaretoken).val(document.cookie.match('csrftoken=([a-zA-Z0-9]{32})')[1])
})
</script>

требуется jQuery 1.7 +

0 голосов
/ 30 сентября 2011

Вы когда-нибудь рассматривали возможность отключения CSRF?

для этого просто удалите промежуточное ПО: 'django.middleware.csrf.CsrfViewMiddleware',

0 голосов
/ 13 мая 2013

Если вы впишите токен csrf в некоторую переменную JS на стороне сервера, то позже вы можете отправить собственный HTTP-заголовок, который будет распознан Django

X-CSRFToken: {{ csrf_token }}}

также видно, что Q & A: Ошибка Django CSRF на пост-запросах ajax только в Opera

Пример рабочего запроса:

POST /main/uploadpage/ HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Content-Length: 505853
Origin: http://127.0.0.1:8000
X-File-Name: Screen Shot 2013-05-12 at 5.13.34 PM (2).png
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31
Content-Type: image/png
Cache-Control: no-cache
X-Requested-With: XMLHttpRequest
X-CSRFToken: 1kCcyDzpHIxicSzCqvuXUMbpGaXvFpCZ
Accept: */*
Referer: http://127.0.0.1:8000/main/uploadpage/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
0 голосов
/ 30 сентября 2011

Вы можете использовать декоратор csrf_exempt в вашем представлении

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

...