Django 1.6如果缺少csrf cookie,则忽略HTTP_X_CSRFTOKEN头
我有AJAX代码,它向Django 1.6.4应用程序发出POST请求。视图通过Django 1.6如果缺少csrf cookie,则忽略HTTP_X_CSRFTOKEN头,django,django-csrf,django-1.6,Django,Django Csrf,Django 1.6,我有AJAX代码,它向Django 1.6.4应用程序发出POST请求。视图通过django.middleware.CSRF.CsrfViewMiddleware启用了CSRF保护。如果我没有传递cookie,但传递了HTTP_X_CSRFTOKEN,那么它将失败 我正在查看django.middleware.csrf.CsrfViewMiddleware的代码,我在第161行中看到它在从cookie获取它之后检查csrf\u令牌是否为None:。如果没有,则返回。只有在之后,它才会检查csrf
django.middleware.CSRF.CsrfViewMiddleware
启用了CSRF保护。如果我没有传递cookie,但传递了HTTP_X_CSRFTOKEN,那么它将失败
我正在查看django.middleware.csrf.CsrfViewMiddleware
的代码,我在第161行中看到它在从cookie获取它之后检查csrf\u令牌是否为None:
。如果没有,则返回。只有在之后,它才会检查csrfmiddlewaretoken
param和HTTP\u X\u CSRFTOKEN
请求头。这看起来不正确,只有在检查所有可能的位置后才能检查缺少的csrf_令牌值
还有其他人有类似的问题吗?我看错了吗 如果使用jQuery,可以创建包含csrf令牌的beforeSend函数。了解更多信息 请注意,Django查找头
X-CSRFToken
而不是HTTP\u X\u CSRFToken
。
至少这是我在调试代码时遇到的问题。(我还为此检查了django.middleware.csrf.CsrfViewMiddleware
)
如果csrf_令牌为None,则
是Django执行的额外检查。(根据if声明中的注释进行说明
没有CSRF cookie。对于POST请求,我们坚持使用CSRF cookie,
通过这种方式,我们可以避免所有CSRF攻击,包括登录
CSRF
我认为(不确定)没有一个检查只验证来自ajax post请求的头,
Django将进行检查以防止任何形式的CSRF攻击。我认为混淆可能是CSRF cookie和HTTP\u X\u CSRFTOKEN
HTTP头存在于比较的另一侧。换句话说,为了防止CSRF攻击,Django比较:
CSRF cookie值与POST令牌值(“csrfmiddlewaretoken”)
(或)
CSRF cookie值与HTTP头值(“HTTP_X_CSRFTOKEN”)
这就是为什么cookie总是必要的。使用HTTP\u X\u CSRFTOKEN
头是在POST数据中设置令牌的替代品,而不是cookie的替代品。我知道并正在使用beforeSend
。虽然HTTP头称为X-CSRFTOKEN,但Django通过在但是,这不是我的问题。我提供了头值,Django甚至没有查看它(请查看我在原始帖子中引用的Django源代码)