Выйти из django, используя ссылку или форму, чтобы предотвратить использование csrf - PullRequest
2 голосов
/ 29 марта 2012

читая главу djangobook , я натолкнулся на раздел, в котором упоминается эксплойт csrf, в котором ссылка на выход из системы была размещена на скрытом вредоносном сайте.

В веб-приложении, которое я создал с помощью django, я использовал аналогичную ссылку выхода из системы

base.html:

<a  href="{% url my_logout %}" > Logout </a>

где URL my_logout указывает на django.contrib.auth.views.logout_then_login

urlpatterns=patterns('django.contrib.auth.views',
url(r'^logout/$', 'logout_then_login', {}, name = 'my_logout'),
)

Теперь, прочитав о нападении csrf, я боюсь, что вредоносный сайт может доставить мне неприятности. Итак, я хотел бы использовать форму для выхода из системы.

Я думал, что смогу сделать так

base.html:

    ...

    <form method="post" action=".">{% csrf_token %}
        <input type="hidden" name="next" value="{{next}}" />
        <input type="hidden" name="confirm" value="true" />
        <input type="submit" value="Logout" />
    </form>
...

Теперь, как мне написать представление для обработки этой формы? Если я должен обработать скрытые переменные (confirm, чтобы проверить, должен ли быть выполнен выход из системы, и next, чтобы перейти к предыдущему представлению), я все еще буду быть в состоянии использовать метод django.contrib.auth.views.logout_then_login?

Может кто-нибудь сказать мне, правильно ли я это делаю?

заранее спасибо

1 Ответ

3 голосов
/ 29 марта 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

@csrf_protect
@require_POST
@never_cache
def safer_logout(request):
    # 'confirm' is useless here, POST implies 'do it'
    return logout_then_login(request, request.POST.get('next'))

Также рассмотрите возможность использования SESSION_COOKIE_HTTPONLY

...