【问题标题】:Django 1.6 HTTP_X_CSRFTOKEN header ignored if csrf cookie is missing如果缺少 csrf cookie,则忽略 Django 1.6 HTTP_X_CSRFTOKEN 标头
【发布时间】:2014-07-16 12:21:31
【问题描述】:

我有向 Django 1.6.4 应用程序发出 POST 请求的 AJAX 代码。该视图通过django.middleware.csrf.CsrfViewMiddleware 启用了 CSRF 保护。如果我不传递 cookie 但传递了 HTTP_X_CSRFTOKEN,它会失败。

我正在查看django.middleware.csrf.CsrfViewMiddleware 的代码,我在第 161 行看到它在从 cookie 中获取 if csrf_token is None: 后检查它是否。如果为 None,则返回。之后它才检查csrfmiddlewaretoken 参数和HTTP_X_CSRFTOKEN 请求标头。这看起来不正确,只有在检查了所有可能的位置以找到它之后才能检查是否缺少 csrf_token 值。

其他人有类似的问题吗?我看错了吗?

【问题讨论】:

    标签: django django-csrf django-1.6


    【解决方案1】:

    我认为混淆可能是 CSRF cookie 和 HTTP_X_CSRFTOKEN HTTP 标头存在于比较的相反两侧。也就是说,为了防止 CSRF 攻击,Django 比较:

    CSRF cookie 值与 POST 令牌值(“csrfmiddlewaretoken”)

    (或)

    CSRF cookie 值与 HTTP 标头值(“HTTP_X_CSRFTOKEN”)

    这就是为什么 cookie总是是必要的。使用HTTP_X_CSRFTOKEN 标头可以替代在 POST 数据中设置令牌,而不是替代 cookie。

    【讨论】:

      【解决方案2】:

      如果您使用 jQuery,您可以创建一个包含 csrf 令牌的 beforeSend 函数。 Django CSRF 了解更多信息。

      请注意,Django 寻找标头 X-CSRFToken 而不是 HTTP_X_CSRFTOKEN。 至少这是我在调试代码时遇到的问题。 (我还为此检查了django.middleware.csrf.CsrfViewMiddleware


      if csrf_token is None 是 Django 完成的额外检查。 (来自 if 语句中的评论。

      没有 CSRF cookie。对于 POST 请求,我们坚持使用 CSRF cookie, 这样我们就可以避免所有的CSRF攻击,包括登录 CSRF。

      我认为(不确定)没有单一的检查来仅验证来自 ajax 发布请求的标头, 并且 Django 会进行检查以防止任何形式的 CSRF 攻击。

      【讨论】:

      • 我知道beforeSend 并正在使用它。虽然 HTTP 标头称为 X-CSRFToken,但 Django 通过在 HTTP_ 前面加上 HTTP_X_CSRFTOKEN 使其可用。见docs.djangoproject.com/en/dev/ref/request-response/…。然而,这不是我的问题。我提供了 header 值,Django 连看都不看(请看我在原帖中引用的 Django 源码)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2020-09-20
      相关资源
      最近更新 更多