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

Kry*_*ski 3 django django-csrf django-1.6

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

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

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

SMX*_*SMX 6

我认为混淆可能是CSRF cookie和HTTP_X_CSRFTOKENHTTP标头存在于比较的相对侧。换句话说,为了防止CSRF攻击,Django比较了:

CSRF Coo​​kie值与POST令牌值(“ csrfmiddlewaretoken”)

(要么)

CSRF Coo​​kie值与HTTP标头值(“ HTTP_X_CSRFTOKEN”)

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