Passer le jeton CSRF Django à Angular avec le COOKIE CSRF HTTPONLY

à Django, lorsque le paramètre CSRF_COOKIE_HTTPONLY est mis à True, le cookie CSRF obtient le drapeau httponly, ce qui est souhaitable du point de vue de la sécurité, mais casse la solution angulaire standard de l'ajout de ce cookie au httpProvider comme suit:

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';

par Django 1.9, il y avait une solution de contournement où vous pouviez passer le cookie directement à l'application en mettant ceci dans le modèle:

<script>
    window.csrf_token = "{{ csrf_token }}";
</script>

Et de mettre cela dans le application angulaire:

angularApp.config(["$httpProvider", function($httpProvider)e {
    $httpProvider.defaults.headers.common["X-CSRFToken"] = window.csrf_token;
}]

malheureusement, cela ne fonctionne pas pour les applications angulaires d'une seule page dans Django 1.10+ car le cookie CSRF change après chaque requête. Comment faire des demandes de poste D'Angular à Django 1.10+ avec le réglage CSRF_COOKIE_HTTPONLY ?

NB: désactiver la protection CSRF n'est pas une réponse acceptable.

6
demandé sur DhiaTN 2016-11-28 21:55:31

1 réponses

je pense que cette question a été bien répondu dans cette discussion.

https://groups.google.com/forum/#!topic / django-developers/nXjfLd8ba5k

https://code.djangoproject.com/ticket/27534

CSRF_COOKIE_HTTPONLY ne fournit aucune sécurité supplémentaire pour les applications de page unique. Certaines personnes ont recommandé cette solution

var csrftoken = getCookie('csrftoken');
if (csrftoken === null) {
    csrftoken = $('input[name="csrfmiddlewaretoken"]').val();
    if (csrftoken === null) {
        console.log('No csrf token');
    }
}

cependant ou si vous êtes exposant csrftoken pour votre application restfully rien n'arrête la malcious utilisateur de le prendre et l'utiliser. Si vous utilisez une application d'une seule page, vous pouvez aussi bien définir CSRF_COOKIE_HTTPONLY=False, comme dans le commentaire ci-dessous:

Gavin Wahl 5/4/15

comment ça? Vous ne pouvez pas juste ajax-fetch stuff de différents domaines.

je parle d'un single domaine. Injecté javascript sur une page qui ne contient pas le jeton CSRF peut aller chercher une page différente sur la même domaine de l'obtenir.

si vous avez déjà injecté javascript sur la page des victimes (XSS), il n'est pas nécessaire de récupérer le jeton CSRF, vous avez déjà un meilleur contrôle.

Eh bien, le drapeau HttpOnly est destiné à réduire les dommages d'un attaquant peut faire une fois que le déjà peut injecter javascript. Mais Je d'accord -- se cacher le jeton CSRF de javascript n'augmente en rien la sécurité, mais la documentation le laisse entendre. Je tiens à préciser, dans le documentation que ce cadre n'a pas d'effet significatif.

si vous pensez toujours avoir un vecteur d'attaque valide, veuillez l'Envoyer à secu...@djangoproject.com et ajoutez un peu plus d'explications.

Il n'y a pas de vecteur d'attaque. C'est à peu près trompeur documentation.

0
répondu PhilippeT 2018-05-14 03:31:26