web-dev-qa-db-fra.com

problèmes de sécurité dans le stockage JWT

Je crée un mécanisme de connexion JWT pour un site.

Il existe deux opinions très opposées sur la façon de stocker le JWT. Stormpath ne jure que par les cookies httponly: https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage Auth0 jure par localStorage: https://auth0.com/blog/cookies-vs-tokens-definitive-guide

Au début, je me suis rangé du côté d'Auth0, puis de Stormpath, mais maintenant je pense de nouveau que localStorage est le meilleur. Les pièges de localStorage est une attaque xss peut capturer le JWT, le piège de auth0 est une attaque csrf peut voler le cookie.

Il semble que le développeur puisse rendre la méthode des cookies vraiment difficile pour le pirate informatique pour accéder via CSRF, mais pas impossible. Cependant, si le développeur utilise localStorage et gère sa base de code et assainit ses entrées, il semble que le pirate n'a aucun moyen d'entrer, est-ce faux?

12
user2331566

L'argument principal pour le stockage local semble être le suivant:

il est plus facile de se protéger contre XSS que de se protéger contre XSRF

L'argument en est que XSS est censé être résolu par l'assainissement automatique des entrées, tandis que CSRF est difficile à comprendre.

Le deuxième point peut être vrai ou non, mais - comme le dit votre source - une protection complète contre CSRF est relativement simple. Si votre application est reposante, il s'agit simplement de vérifier toutes les POST demandes de token CSRF *.

XSS d'autre part n'est pas aussi simple que cela. L'assainissement d'entrée n'est pas la solution, le codage de la sortie l'est. Et le problème est que cet encodage dépend du contexte. Un codage différent est par exemple nécessaire si vous êtes dans un contexte JavaScript ou HTML.

Alors que certains cadres fournissent des moteurs de modèles avec un codage automatique, d'autres non. Et l'encodage automatique n'encode généralement que HTML, mais ne prend pas en compte XSS dans un contexte JavaScript. Ajoutant à cela que de nombreux développeurs ignorent les moteurs de modèles dans certains cas et produisent directement les entrées des utilisateurs, je dirais que XSS est plus difficile à défendre que CSRF.

* C'est un peu simplifié et il y a d'autres choses à considérer. L'injection HTML par exemple peut entraîner une fuite de jetons CSRF, et l'application peut en fait utiliser des requêtes GET pour modifier l'état du serveur.

Conclusion

Je ne suis pas d'accord pour dire que XSS est plus facile à défendre que CSRF. Comme c'est l'argument principal du stockage local, j'opterais pour l'approche des cookies. Il fournit une petite atténuation pour XSS et a également l'avantage supplémentaire de garantir que les données pertinentes ne sont envoyées que via HTTPS (via l'attribut de cookie sécurisé).

7
tim

D'après mon expérience en tant que développeur et testeur de stylo, je dirais qu'il est probablement plus facile de travailler avec un cadre de développement Web doté d'une protection intégrée contre CSRF que d'avoir des développeurs correctement protégés contre XSS. Cela suggérerait la solution de Stormpath.

Il y a de fortes chances que vous souhaitiez probablement vous protéger contre les deux attaques de toute façon.

4
Colin Cassidy

L'utilisation d'une combinaison des deux est probablement plus sûre, car chaque magasin vous protège contre une forme d'attaque (XSS ou CSRF). Voici un bel article sur le même sujet:

http://www.redotheweb.com/2015/11/09/api-security.html

0
amit_saxena