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

时间:2014-08-26 13:51:00

标签: python django django-csrf csrf-protection

我对Django CsrfViewMiddleware机制有疑问。 我知道,Django:

  1. 在每个请求上设置新的csrftoken cookie。
  2. 检查,比X-CSRFToken标头值(或隐藏输入" csrfmiddlewaretoken")必须等于csrftoken cookie。
  3. 但是Django没有检查令牌是否已被使用过(例如来自CsrfViewMiddleware):

    if not constant_time_compare(request_csrf_token, csrf_token):
                return self._reject(request, REASON_BAD_TOKEN)
    

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

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

1 个答案:

答案 0 :(得分:0)

不消耗CSRF令牌。

详细说明Germano的评论,背后的原因很简单:

多个浏览器窗口/标签 REST

基本上,Django必须为过去呈现的每个页面创建(并持久化,并在分布式“云”部署中同步)新的CSRF令牌。从本质上讲,这很容易导致拒绝服务攻击,在这种情况下,您无法为CSRF假设任何明智的过期。