我希望我的网站登录表单每次刷新页面时都会生成一个新的CSRF令牌。
我试着打电话
logout(request)
request.session.flush()
但是隐藏的表单字段总是具有相同的标记,即使在服务器重启后也是如此。
这显然意味着django正在从cookie中读取数据。 如何使它忽略cookie并生成一个新的?
或者,有没有办法让我有一个中间页面,在进入实际登录页面之前清除所有cookie?如何在Javascript中删除我的域的所有cookie?
答案 0 :(得分:5)
您可以按如下方式手动重置令牌:
from django.middleware.csrf import _get_new_csrf_key
request.META["CSRF_COOKIE_USED"] = True
request.META["CSRF_COOKIE"] = _get_new_csrf_key()
在Django> = 1.6中,您应该使用django.middleware.csrf.rotate_token(request)
,这正是这样做的。
答案 1 :(得分:2)
尝试将CSRF_COOKIE_AGE=None
设置为使用基于会话的CSRF cookie,这样可以将cookie保留在内存中而不是持久存储中。我想如果您注销用户,CSRF令牌应该会改变。 See the docs.