我有一个关于 Django CsrfViewMiddleware 机制的问题。 我知道,Django:
- 为每个请求设置新的 csrftoken cookie。
- 检查 X-CSRFToken header 值(或隐藏输入“csrfmiddlewaretoken”)必须等于 csrftoken cookie。
但 Django 不检查 token 是否已被使用(来自 CsrfViewMiddleware 的示例):
if not constant_time_compare(request_csrf_token, csrf_token):
return self._reject(request, REASON_BAD_TOKEN)
所以我可以使用相同的 token 发布多个请求(我在我的服务器上测试过)。
这是标准行为,还是我的 Django 设置不正确? 谢谢。
最佳答案
CSRF token 不会被消耗。
要详细说明 Germano 的评论,其背后的原因很简单:
多个浏览器窗口/标签和REST
本质上,Django 必须为过去呈现的每个页面创建(并持久化,并在分布式“云”部署中同步)新的 CSRF token 。从本质上讲,这很容易导致拒绝服务攻击,在这种情况下您不能假设 CSRF 有任何合理的过期时间。
关于python - django csrf token 在每个请求上都必须是唯一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507514/