web-dev-qa-db-fra.com

Est-il prudent de stocker un JWT dans le stockage local avec reactjs?

Je suis en train de construire une application d'une seule page en utilisant reactjs. J'ai lu que bon nombre des raisons de ne pas utiliser localStorage sont dues aux vulnérabilités XSS. Puisque React échappe à toutes les entrées utilisateur, serait-il maintenant sûr d'utiliser localStorage?

98
Nate

Dans la plupart des applications modernes à page unique, nous devons en effet stocker le jeton quelque part du côté client (cas d'utilisation le plus courant - pour que l'utilisateur reste connecté après l'actualisation de la page).

Deux options sont disponibles: Stockage Web (stockage de session, stockage local) et un cookie côté client. Les deux options sont largement utilisées, mais cela ne signifie pas qu'elles sont très sécurisées.

Tom Abbott résume bien le sécurité de JWT sessionStorage et localStorage :

Le stockage Web (localStorage/sessionStorage) est accessible via JavaScript sur le même domaine. Cela signifie que tout JavaScript exécuté sur votre site aura accès au stockage Web et, de ce fait, peut être vulnérable aux attaques par script intersite (XSS) . XSS, en un mot, est un type de vulnérabilité où un attaquant peut injecter du JavaScript qui sera exécuté sur votre page. Les attaques XSS de base tentent d’injecter du JavaScript via des entrées de formulaire, l’attaquant mettant <script>alert('You are Hacked');</script> dans un formulaire pour voir s’il est exécuté par le navigateur et peut être visualisé par d’autres utilisateurs.

Pour empêcher XSS, la réponse commune consiste à échapper et à coder toutes les données non fiables. React (principalement) le fait pour vous! Voici un excellent discussion sur le degré de protection de la vulnérabilité XSS React responsable .

Mais cela ne couvre pas toutes les vulnérabilités possibles! Une autre menace potentielle est l'utilisation de JavaScript hébergé sur des CDN ou des infrastructures externes .

Voici encore Tom:

Les applications Web modernes incluent des bibliothèques JavaScript tierces pour les tests A/B, l'analyse de l'entonnoir/du marché et les annonces. Nous utilisons des gestionnaires de paquets comme Bower pour importer le code d’autres personnes dans nos applications.

Que se passe-t-il si un seul des scripts que vous utilisez est compromis? Un code JavaScript malveillant peut être intégré à la page et le stockage Web est compromis. Ces types d'attaques XSS peuvent amener le stockage Web de tout le monde à visiter votre site, à leur insu. C'est probablement la raison pour laquelle de nombreuses organisations conseillent de ne rien stocker. de valeur ou de confiance toute information dans le stockage Web. Cela inclut les identificateurs de session et les jetons.

Par conséquent, ma conclusion est qu’en tant que mécanisme de stockage, le stockage Web n’applique aucune norme sécurisée pendant le transfert . Quiconque lit Web Storage et l’utilise doit faire preuve de diligence raisonnable pour s’assurer qu’il envoie toujours le fichier JWT via HTTPS et jamais HTTP.

107
Kaloyan Kosev

Je sais que c’est une vieille question, mais selon ce que @ mikejones1477 a dit, les bibliothèques et les frameworks d’avant-garde modernes échappent au texte, ce qui vous assure une protection contre XSS. La raison pour laquelle les cookies ne sont pas une méthode sécurisée d'utilisation des informations d'identification est que les cookies n'empêchent pas CSRF lorsque localStorage le fait (rappelez-vous également que les cookies sont également accessibles en javascript, de sorte que XSS n'est pas le gros problème ici), cette réponse reprendre pourquoi .

La raison pour laquelle un jeton d’authentification est stocké dans le stockage local et ajoutée manuellement à chaque requête protégée contre CSRF est la clé Word: manual. Étant donné que le navigateur n'envoie pas automatiquement ce jeton d'authentification, si je visite evil.com, il parvient à envoyer un POST http://example.com/delete-my-account , il ne pourra pas envoyer mon jeton d'authn, la requête est donc ignorée.

Bien sûr, httpOnly est le Saint Graal, mais vous ne pouvez pas accéder à partir de reactjs ou de tout framework Js à côté de vous avez toujours une vulnérabilité CSRF. Ma recommandation serait localstorage ou si vous souhaitez utiliser des cookies, assurez-vous de mettre en œuvre une solution à votre problème CSRF tel que Django fait .

En ce qui concerne les CDN, assurez-vous de ne pas utiliser de CDN bizarre, par exemple un CDN tel que google ou bootstrap fournir, sont gérés par la communauté et ne contiennent pas de code malveillant. Si vous n'êtes pas sûr, vous êtes libre de revoir.

24
Mauricio Cortazar

Ce n'est pas sûr si vous utilisez un CDN:

Un code JavaScript malveillant peut être intégré à la page et le stockage Web est compromis. Ces types d’attaques XSS peuvent amener le stockage Web de tout le monde à visiter votre site, à leur insu. C’est probablement la raison pour laquelle un groupe d’organisations déconseillent de stocker des informations de valeur ou de faire confiance aux informations stockées sur le Web. Cela inclut les identificateurs de session et les jetons.

via stormpath

Tout script dont vous avez besoin de l'extérieur pourrait être potentiellement compromis et pourrait extraire n'importe quel JWTS du stockage de votre client et renvoyer des données personnelles au serveur de l'attaquant.

5
Stephen L

En gros, vous pouvez stocker votre JWT dans votre stockage local.

Et je pense que c'est un bon moyen. Si nous parlons de XSS, XSS utilisant CDN, il risque également d’obtenir votre identifiant client/passe. Le stockage de données dans le stockage local empêchera au moins les attaques CSRF.

Vous devez être conscient des deux et choisir ce que vous voulez. N'oubliez pas que: VOUS ÊTES SÉCURISÉ COMME MOINS LE POINT SÉCURISÉ DE VOTRE APP.

Encore une fois, le stockage est OK, soyez vulnérable à XSS, CSRF, ... n'est pas

3
Alex Lyalka

Localstorage est conçu pour être accessible en javascript, de sorte qu'il ne fournit aucune protection XSS. Comme indiqué dans d'autres réponses, il existe de nombreuses façons de mener une attaque XSS, à partir de laquelle le stockage local n'est pas protégé par défaut.

Cependant, les cookies ont des indicateurs de sécurité qui protègent des attaques XSS et CSRF. L'indicateur HttpOnly empêche le javascript côté client d'accéder au cookie, l'indicateur Sécurisé permet uniquement au navigateur de transférer le cookie via SSL, et l'indicateur SameSite garantit que le cookie est envoyé uniquement à l'origine. Bien que je vienne de vérifier et que SameSite ne soit actuellement pris en charge que dans Opera et Chrome, il est donc préférable d’utiliser d’autres stratégies pour protéger CSRF. Par exemple, l'envoi d'un jeton crypté dans un autre cookie avec des données d'utilisateur publiques.

Les cookies constituent donc un choix plus sûr pour stocker les données d'authentification.

3
Ivan

Le cookie localStorage ou httpOnly n'est-il pas acceptable? En ce qui concerne une bibliothèque tierce compromise, la seule solution à ma connaissance qui réduirait/empêcherait le vol d’informations sensibles serait appliquée Intégrité de la sous-source .

L'intégrité de la sous-ressource (SRI) est une fonctionnalité de sécurité qui permet aux navigateurs de vérifier que les ressources extraites (par exemple, à partir d'un CDN) sont livrés sans manipulation imprévue. Cela fonctionne en vous permettant de fournir un hachage cryptographique auquel une ressource extraite doit correspondre.

Tant que la bibliothèque tierce compromise est active sur votre site Web, un enregistreur de frappe peut commencer à collecter des informations telles que le nom d'utilisateur, le mot de passe et tout ce que vous entrez sur le site.

Un cookie httpOnly empêchera l'accès à partir d'un autre ordinateur, mais n'empêchera pas le pirate de manipuler l'ordinateur de l'utilisateur.

0
SILENT