Django CSRF проблемы с cookie-файлами отключены - PullRequest
3 голосов
/ 28 ноября 2009

При тестировании приложения, написанного на Django, я обнаружил, что мне будет выдаваться ошибка HTTP 403 Forbidden каждый раз, когда я отправляю форму. Мне известно, что промежуточное программное обеспечение CSRF проверяет наличие cookie с помощью токена CSRF, но какой подход должен быть предоставлен пользователю, у которого отключены файлы cookie?

Нужно ли проверять, включены ли у пользователя файлы cookie в каждом из моих просмотров, или есть более эффективный подход?

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

Этот вопрос касался Django pre-1.2 - решение будет другим, если у вас более старая версия.

Ответы [ 4 ]

1 голос
/ 07 марта 2011

Начиная с Django 1.2, вы можете переопределить ответ 403, используя CSRF_FAILURE_VIEW .

1 голос
/ 06 декабря 2009

Просто для тех, у кого есть такая же проблема: я обнаружил, что для меня лучше всего подходит промежуточное программное обеспечение, которое отображает общую страницу ошибок 403:

from django.http import HttpResponseForbidden
from django.conf import settings

from django.template import RequestContext
from django.shortcuts import render_to_response

class PermissionErrorMiddleware(object):
    def process_response(self, request, response):
        if isinstance(response, HttpResponseForbidden):
            return render_to_response('403.html', context_instance=RequestContext(request)) 

        return response

Он сообщает пользователю, что наиболее вероятной причиной появления страницы с ошибкой является то, что cookie-файлы отключены (среди прочего), потому что в противном случае мое приложение на самом деле не выдает 403 ошибки. Я всегда предпочитал подход «безопасность через неизвестность» и выбрасывал 404 ошибки, когда пользователь не должен обращаться к конкретной странице.

0 голосов
/ 06 декабря 2009

Вы пытались передать информацию csrf как скрытую переменную POST? В проектах, в которых я принимал участие, это обычно делается со скрытым вводом:

<input type="hidden" name="csrf" value="<?=$person->csrf?>" />

Извините за код PHP, я не помню, как это сделать в шаблонах Django.

0 голосов
/ 28 ноября 2009

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

...