J'ai le code AJAX qui fait des requêtes POST à une application Django 1.6.4. La vue dispose d'une protection CSRF activée via le django.middleware.csrf.CsrfViewMiddleware
. Si je ne passe pas un cookie mais que je passe le HTTP_X_CSRFTOKEN, il échoue.En-tête Django 1.6 HTTP_X_CSRFTOKEN ignoré si le cookie csrf est manquant
Je regarde le code de django.middleware.csrf.CsrfViewMiddleware
et je vois que sur la ligne 161 il vérifie pour voir si if csrf_token is None:
après l'obtenir du cookie. Si c'est None, il revient. Ce n'est que par la suite qu'il vérifie le paramètre csrfmiddlewaretoken
et l'en-tête de demande HTTP_X_CSRFTOKEN
. Cela semble incorrect et la vérification d'une valeur csrf_token manquante ne doit être faite qu'après avoir vérifié tous les endroits possibles pour l'endroit où il pourrait être trouvé.
Quelqu'un d'autre avait des problèmes similaires? Est-ce que je vois cela incorrectement?
Je connais le 'beforeSend' et je l'utilise. Alors que l'en-tête HTTP s'appelle X-CSRFToken, Django le rend disponible sous le nom HTTP_X_CSRFTOKEN, en préfixant le HTTP_. Voir https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META. Ceci, cependant, n'est pas mon problème. Je fournis la valeur de l'en-tête, et Django ne la regarde même pas (veuillez regarder la source Django que j'ai référencée dans le message original) –
Mise à jour de ma réponse. – Eagllus