Основная проблема заключается в следующем: когда пользователи, которые не разрешают файлы cookie, пытаются войти на мой сайт Django, они получают ошибку CSRF и перенаправляются на страницу 403 Forbidden. Было бы намного лучше, если бы они получили сообщение о том, что они должны разрешить файлы cookie.

Я подумываю решить эту проблему, установив CSRF_FAILURE_VIEW и просто отобразив страницу с сообщением о том, что файлы cookie необходимы. Предполагается, что единственный способ законного пользователя получить отказ CSRF - это запретить использование файлов cookie.

Однако, когда я смотрю на код Django, мне кажется, что в форме входа в систему можно не отображать ошибку файлов cookie. Вот чистый метод django.contrib.auth.forms.AuthenticationForm:

def clean(self):
    username = self.cleaned_data.get('username')
    password = self.cleaned_data.get('password')

    if username and password:
        self.user_cache = authenticate(username=username,
                                       password=password)
        if self.user_cache is None:
            raise forms.ValidationError(
                self.error_messages['invalid_login'] % {
                    'username': self.username_field.verbose_name
                })
        elif not self.user_cache.is_active:
            raise forms.ValidationError(self.error_messages['inactive'])
    self.check_for_test_cookie()
    return self.cleaned_data

def check_for_test_cookie(self):
    if self.request and not self.request.session.test_cookie_worked():
        raise forms.ValidationError(self.error_messages['no_cookies'])

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

Что мне здесь не хватает?

Обновление: Я попытался установить CSRF_FAILURE_VIEW на свой собственный обработчик. Обработчику передается строка, объясняющая сбой. В этом случае я получаю сообщение «CSRF cookie not set.», Что достаточно для обнаружения отключенных файлов cookie.

0
Chuck 26 Фев 2014 в 00:47
Вы также добавили процессор контекста django.core.context_processors.csrf в свой settings.py?
 – 
Drewness
26 Фев 2014 в 00:51
Спасибо. Я попытался добавить этот контекстный процессор. Без изменений. Чтобы быть ясным, все работает хорошо, когда клиент разрешает файлы cookie.
 – 
Chuck
26 Фев 2014 в 06:26

1 ответ

Лучший ответ

Вы можете сделать это, установив тестовый файл cookie .

Это есть в документации Django, как вы можете реализовать это.

Из документов Джанго:

Для удобства Django предоставляет простой способ проверить, принимает ли браузер пользователя файлы cookie. Просто вызовите метод set_test_cookie() запроса.session в представлении и вызовите test_cookie_worked() в следующем представлении, а не в том же вызове представления.

Это означает, что если клиент не включил файлы cookie в своем браузере, вместо ошибки 403 ему будет показано сообщение о включении файлов cookie после , когда он щелкнет кнопка входа .

0
xyres 21 Апр 2014 в 14:32