Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 1.6如果缺少csrf cookie,则忽略HTTP_X_CSRFTOKEN头_Django_Django Csrf_Django 1.6 - Fatal编程技术网

Django 1.6如果缺少csrf cookie,则忽略HTTP_X_CSRFTOKEN头

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

我有AJAX代码,它向Django 1.6.4应用程序发出POST请求。视图通过
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源代码)