web-dev-qa-db-fra.com

Jeton CSRF nécessaire lors de l'utilisation de l'authentification sans état (= sans session)?

Est-il nécessaire d'utiliser la protection CSRF lorsque l'application s'appuie sur une authentification sans état (en utilisant quelque chose comme HMAC)?

Exemple:

  • Nous avons une seule application de page (sinon, nous devons ajouter le jeton sur chaque lien: <a href="...?token=xyz">...</a>.

  • L'utilisateur s'authentifie avec POST /auth. En cas d'authentification réussie, le serveur renverra un jeton.

  • Le jeton sera stocké via JavaScript dans une variable de l’application à page unique.

  • Ce jeton sera utilisé pour accéder à des URL restreintes comme /admin.

  • Le jeton sera toujours transmis à l'intérieur des en-têtes HTTP.

  • Il n'y a PAS de session HTTP ni de cookies.

Autant que je sache, il devrait (?!) Ne pas avoir la possibilité d’utiliser des attaques entre sites, car le navigateur ne stocke pas le jeton et ne peut donc pas l’envoyer automatiquement au serveur (c’est ce qui se produirait lors de l’utilisation de Cookies/Session).

Est-ce que je manque quelque chose?

111
Benjamin M

J'ai trouvé des informations sur CSRF + en utilisant aucun cookie pour l'authentification:

  1. https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
    "Puisque vous ne vous fiez pas aux cookies, vous n'avez pas besoin de vous protéger contre les requêtes intersites"

  2. http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
    "Si nous utilisons les cookies, vous devez vraiment utiliser CSRF pour éviter les requêtes intersites. C’est quelque chose que nous pouvons oublier lors de l’utilisation de JWT, comme vous le verrez."
    (JWT = Json Web Token, une authentification basée sur le jeton pour les applications sans état)

  3. http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
    "Le moyen le plus simple de procéder à l'authentification sans risquer de vulnérabilités CSRF est tout simplement d'éviter d'utiliser des cookies pour identifier l'utilisateur"

  4. http://sitr.us/2011/08/26/cookies-are-bad-for-you.html
    "Le principal problème de CSRF est que les cookies ne fournissent absolument aucune défense contre ce type d'attaque. Si vous utilisez l'authentification par cookie, vous devez également prendre des mesures supplémentaires pour vous protéger contre les CSRF. La précaution la plus élémentaire à prendre est pour vous assurer que votre application ne provoque aucun effet secondaire en réponse aux requêtes GET. "

Il y a beaucoup plus de pages, indiquant que vous n'avez pas besoin de protection CSRF, si vous n'utilisez pas de cookies pour l'authentification. Bien sûr, vous pouvez toujours utiliser les cookies pour tout le reste, mais évitez de stocker quelque chose comme session_id à l'intérieur.


Si vous devez vous souvenir de l'utilisateur, il y a 2 options:

  1. localStorage: un magasin de valeurs-clés dans le navigateur. Les données stockées seront disponibles même après la fermeture de la fenêtre du navigateur par l'utilisateur. Les données ne sont pas accessibles par d'autres sites Web, car chaque site dispose de son propre stockage.

  2. sessionStorage: Également un magasin de données du navigateur. La différence est la suivante: les données sont supprimées lorsque l'utilisateur ferme la fenêtre du navigateur. Mais cela reste utile si votre application Web est composée de plusieurs pages. Donc, vous pouvez faire ce qui suit:

    • L'utilisateur se connecte, puis vous stockez le jeton dans sessionStorage
    • L'utilisateur clique sur un lien qui charge une nouvelle page (= un lien réel et sans contenu javascript à remplacer)
    • Vous pouvez toujours accéder au jeton à partir de sessionStorage
    • Pour vous déconnecter, vous pouvez supprimer manuellement le jeton de sessionStorage ou attendre que l'utilisateur ferme la fenêtre du navigateur, ce qui effacera toutes les données stockées.

(pour les deux, regardez ici: http://www.w3schools.com/html/html5_webstorage.asp )


Existe-t-il des normes officielles pour l’authentification de jeton?

[~ # ~] jwt [~ # ~] (Json Web Token): Je pense que c'est toujours un brouillon, mais il est déjà utilisé par beaucoup de gens et le concept semble simple et sécurisé. (IETF: http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25 )
Il existe également des bibliothèques pour de nombreux frameworks disponibles. Juste google pour ça!

148
Benjamin M

TL; DR

Un JWT, s'il est utilisé sans cookies, supprime la nécessité d'un jeton CSRF - MAIS! En stockant JWT dans session/localStorage, vous exposez votre JWT et l'identité de l'utilisateur si votre site présente une vulnérabilité XSS (assez courante). Il est préférable d’ajouter une clé csrfToken au JWT et de l’enregistrer dans un cookie avec secure et http-only attributs définis.

Lisez cet article avec une bonne description pour plus d'informations https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

Vous pouvez rendre cette protection CSRF sans état en incluant une revendication JWT xsrfToken:

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["Explorer", "solar-harvester", "seller"], "sub": "[email protected]", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

Vous aurez donc besoin de stocker csrfToken dans localStorage/sessionStorage ainsi que dans le JWT lui-même (qui est stocké dans un cookie sécurisé et uniquement http). Ensuite, pour la protection csrf, vérifiez que le jeton csrf du fichier JWT correspond à l’en-tête csrf-token soumis.

53
Scott Jungwirth