я должен использовать @csrf_protect в моем представлении выхода django вместе с промежуточным программным обеспечением - PullRequest
5 голосов
/ 30 марта 2012

У меня есть пользовательский вид выхода из системы. Я добавил декораторы, как показано ниже

from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
from django.views.decorators.http import require_POST
from django.contrib.auth.views import logout_then_login

@csrf_protect
@require_POST
@never_cache
def logout(request):
    nxt=request.POST.get('next')
    print 'next=',nxt
    return logout_then_login(request, nxt)

В моем файле настроек у меня есть следующие классы промежуточного программного обеспечения

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

Поскольку CsrfViewMiddleware включенздесь, действительно ли мне нужен @csrf_protect для моего взгляда? Если я использую оба, возникнет ли какая-то проблема / конфликт?

В качестве отступления, когда я проверил источник django , яобнаружил, что декораторы применяются только для представления входа в систему, а не для какого-либо из операций выхода из системы, представлений login_then_logout. Почему это так?

Любая помощь приветствуется

1 Ответ

5 голосов
/ 30 марта 2012

Промежуточное программное обеспечение обеспечивает общую защиту для всех видов - добавление декоратора является излишним.Документы Django рекомендуют использовать Middleware поверх декоратора, поскольку он обеспечивает лучшую защиту.

Использование декоратора само по себе не рекомендуется, так как, если вы забудете его использовать, у вас будет дыра в безопасности.Стратегия использования «пояса и фигурных скобок», заключающаяся в использовании обоих методов, хороша и требует минимальных накладных расходов.

Декораторы не используются для представлений, о которых вы упомянули, потому что практически нет риска того, что сеанс будетперехвачен через CSRF, если инициировано событие login_then_logout и нет угрозы безопасности для пользователя после того, как сеанс был уничтожен.

Похоже, у вас много вопросов относительно CSRF - могу ли я предложить вам заскучать Документация CSRF от Django и CSRF в general ?

...