2014-11-14 3 views
3

У меня есть публичный сайт Django, который использует защиту CSRF.Django CSRF_COOKIE_DOMAIN - как изящно изменить

Я не установил CSRF_COOKIE_DOMAIN. Мой сайт использует субдомены.

Иногда пользователь заканчивает тем, что имеет csrftoken cookie, установленный на .toplevel.com, а также на sub.toplevel.com. Это вызывает проблемы, так как проверка CSRF завершается с ошибкой, если в чеке используется неправильный файл cookie.

Я хотел бы установить CSRF_COOKIE_DOMAIN в .toplevel.com. Тем не менее, я также хотел бы удалить любые csrftoken куки для любых поддоменов *.toplevel.com. Как мне это сделать?

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

ответ

7

У меня была аналогичная проблема. То, как я с этим справлялся, вместе с CSRF_COOKIE_DOMAIN, я также изменил CSRF_COOKIE_NAME, сделав старые cookies устаревшими.

+0

Единственным недостатком является то, что это не очень грациозный подход (запросы POST, которые появляются сразу после того, как эта новая конфигурация завершится с ошибкой). –

+2

Это очень верно, если это изменение происходит между кем-то, выполняющим GET, а затем с немедленным запросом POST, он потерпит неудачу. Это очень маловероятный случай, если на сайте мало пользователей, но если это представляет большую проблему (например, если есть тысячи одновременных пользователей), это может быть устранено путем временного переопределения 'django.middleware.csrf.CsrfViewMiddleware 'и проверку обоих имен файлов cookie в методе process_view. –

+0

@ АлексейКлелешевич вы тоже можете мне помочь с моей проблемой? http://stackoverflow.com/q/29559000/4029893. Похоже, вы поймете. –