django csrf令牌在每个请求中都必须是唯一的吗?

ako*_*zin 7 python django django-csrf csrf-protection

我有一个关于Django CsrfViewMiddleware机制的问题.我知道,Django:

  1. 在每个请求上设置新的csrftoken cookie.
  2. 检查,比X-CSRFToken标头值(或隐藏输入"csrfmiddlewaretoken")必须等于csrftoken cookie.

但Django不检查令牌是否已被使用(例如来自CsrfViewMiddleware):

if not constant_time_compare(request_csrf_token, csrf_token):
            return self._reject(request, REASON_BAD_TOKEN)
Run Code Online (Sandbox Code Playgroud)

所以我可以使用相同的令牌POST多个请求(我在我的服务器上测试它).

它是标准的行为,还是我的Django设置不正确?谢谢.

qdo*_*dot 2

CSRF 令牌不会被消耗。

要详细阐述杰尔马诺的评论,其背后的原因很简单:

多个浏览器窗口/选项卡REST

本质上,Django 必须为过去渲染的每个页面创建(并持久化,并且在分布式“云”部署中同步)新的 CSRF 令牌。从本质上讲,这很容易导致拒绝服务攻击,您无法假设 CSRF 有任何合理的过期时间。