尝试登录已登录的应用程序Django时,CSRF验证失败

ash*_*shu 5 python django

这是我所做的:

  1. 我在浏览器中打开了两个选项卡,并且两个选项卡中都加载了登录表单。

  2. 我在第一个选项卡上使用所需的凭据登录。

  3. 我再次尝试通过在第二个选项卡上提供凭据来登录。
  4. 我在第二个标签上遇到错误:CSRF verification failed. Request aborted

我已{% csrf_token %}在登录表单和 CsrfViewMiddleware中使用settings.py

另外,我尝试使用默认的管理应用程序进行同样的操作,并得到相同的错误。

dhk*_*hke 6

这是可以预料的。登录操作会轮换 CSRF 令牌,否则可以从经过身份验证的会话外部使用该令牌。

因此,您的情况会发生什么:

  1. 检索选项卡 1 中的登录页面(带有未经身份验证的“表单”CSRF 令牌)
  2. 检索选项卡 2 中的登录页面(带有未经身份验证的“表单”CSRF 令牌)
  3. 在选项卡 1 中登录,CSRF“cookie”令牌在服务器端循环,浏览器 cookie 更新
  4. 尝试在选项卡 2 中登录,发送新的 cookie(选项卡不分隔会话),但发送旧的“表单”令牌。
  5. 第二次登录请求被拒绝(因为“form”令牌和“cookie”令牌不匹配)。

这是使用多个浏览器选项卡不会分隔会话这一事实与登录操作循环服务器发送给您的“cookie”CSRF 令牌这一事实之间的交互。

在同一会话中(例如在不同的浏览器选项卡中)发生登录操作之前加载的任何页面现在都将具有不正确的 CSRF“表单”令牌。

  • @ashu我认为从CSRF验证中免除登录表单是常见的做法。由于登录首先是建立凭据的有效性,因此还没有经过身份验证的会话可以劫持。不过,您仍然无法在单独的选项卡中使用具有不同用户名的 django 应用程序。最后登录的选项卡获胜,因为 django 的会话是基于 cookie 的,并且 cookie 在选项卡之间共享。 (2认同)
  • 从模板中删除令牌不会使登录视图在没有 CSRF 的情况下工作,而是使登录根本无法工作,因为您现在永远不会发送服务器期望的令牌。相反,您需要使用 [`csrf_exempt`](https://docs.djangoproject.com/en/1.8/ref/csrf/#django.views.decorators.csrf.csrf_exempt) 装饰视图。 (2认同)