【问题标题】:Django site suddenly requiring users to clear their cookies to get a CSRF tokenDjango 网站突然要求用户清除 cookie 以获取 CSRF 令牌
【发布时间】:2021-08-02 20:27:58
【问题描述】:

我运行的 Django 网站在过去几个月没有进行任何更新,但突然间我收到了一堆来自用户的电子邮件,说他们收到以下错误:

CSRF Failed: CSRF cookie not set.

奇怪的是刷新页面并不能解决问题。解决此问题的唯一方法是让他们手动清除浏览器的 cookie。

请记住,他们在刷新后仍处于登录状态。因此,即使他们没有获得 CSRF cookie,Django 也会确认他们的会话。

虽然我很高兴他们可以清除 cookie 来修复它,但这让我很担心,因为我无法理解正在发生的事情。它大约在 iOS 14.5 发布的同时开始发生,所以我最初认为它可能与此有关,但我刚刚收到了 Android 用户的报告。

以前有人遇到过这种情况吗?有没有什么办法可以解决这个问题,而无需在网站上放置横幅说明如果您看到错误则清除 cookie?

谢谢!

【问题讨论】:

  • 不是一个实际的解决方案,但是如果出现 CSRF 错误,您的 Django 应用程序也可以自动清除它们的 cookie,直到您弄清楚为什么会发生这种情况,因此用户体验会好一点并且不涉及手动步骤。
  • 你使用的是哪个版本的 Django?
  • 你使用cache_page装饰器缓存页面吗?
  • 您能先发制人地检查错误并自动注销该用户吗?强制他们重新登录会重置损坏的 cookie?
  • 有点远景,但我想我也遇到过类似的事情。我最终跑了。 python manage.py clearsessions 清除了数据库中的 django-session 表并解决了问题。

标签: django csrf django-csrf


【解决方案1】:

感谢您的 cmets 和建议!我最终弄清楚发生了什么。

因此,出于某种原因,如果会话 cookie 仍然有效,Django 将不会创建新的 CSRF cookie(即使它已过期/删除)。这似乎是一个错误,但可能是出于安全原因。

就我而言,我已将 SESSION_COOKIE_AGE 延长至 60 * 60 * 24 * 365 * 10,即 10 年。原来CSRF_COOKIE_AGE 的默认值是 1 年。因此,每个登录了一年的人都不再有一个有效的 CSRF cookie,Django 不会给他们一个新的,因为他们的会话仍然有效 9 年。

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 2012-07-16
    • 2014-02-14
    • 2019-12-24
    • 2018-06-09
    • 2018-12-23
    • 2021-02-02
    • 2014-10-09
    • 2016-09-05
    相关资源
    最近更新 更多