Il y a encore des vecteurs d'attaque XSS que vous devez gérer vous-même dans React!
1. XSS via dangerouslySetInnerHTML
Lorsque vous utilisez, dangerouslySetInnerHTMLvous devez vous assurer que le contenu ne contient pas de javascript. React ne peut rien faire ici pour vous.
Cette réponse est incroyable! Avec les extraits de code et les références à la fin ...! Je vous remercie!
Ioanna
L'un des exemples ci-dessus a-t-il été pris en charge par React depuis que cette réponse a été écrite? Je demande, depuis que j'ai lu dans les diapositives suivantes: slideshare.net/kseniadmitrieva/ ... slide # 20 que les accessoires contrôlés par l'utilisateur ont été corrigés dans React 0.14 en novembre 15 '
@omer le problème que vous faites référence était un bogue de sécurité et il a été corrigé, mais le point 3 que j'ai listé n'est pas lié à celui-là, vous pouvez toujours vérifier ce 3ème point de travail en exécutant mon code sous n'importe quelle version de réaction.
CyberPanda Consulting
60
React échappe automatiquement les variables pour vous ... Il empêche l'injection XSS via une chaîne HTML avec Javascript malveillant .. Naturellement, les entrées sont nettoyées avec cela.
Par exemple, disons que vous avez cette chaîne
var htmlString ='<img src="javascript:alert('XSS!')" />';
si vous essayez de rendre cette chaîne en react
render(){return(<div>{htmlString}</div>);}
vous verrez littéralement sur la page toute la chaîne, y compris la <span>balise d'élément. aka dans le navigateur, vous verrez<img src="javascript:alert('XSS!')" />
si vous affichez le code source html, vous verriez
React fait que vous ne pouvez pas insérer de balisage à moins que vous ne créiez les éléments vous-même dans la fonction de rendu ... cela étant dit, ils ont une fonction qui permet un tel rendu, c'est appelé dangerouslySetInnerHTML... voici plus de détails à ce sujet
Éditer:
Peu de choses à noter, il existe des moyens de contourner ce que React échappe. Une méthode plus courante consiste à définir des accessoires pour votre composant. N'étendez pas les données de l'entrée utilisateur comme accessoires!
Échappe à tout? Vraiment? React n'est PAS sûr par défaut, il y a beaucoup de choses que vous devez faire manuellement et d'attaquer les vecteurs que vous devez comprendre. Tout ce que React fait, c'est échapper le code HTML à une chaîne lorsque vous essayez de l'insérer avec {html}. Mais il existe un million d'autres façons d'autoriser XSS, contre lesquelles React ne protège PAS. <a href="{...}" />, <img src = {...} />, <iframe src = "{...} /> et une tonne d'autres accessoires qui permettent d'injecter du javascript exécutable. Et puis il y a des injections de scripts CSS via style = {...} prop. La réponse ci-dessous par @Marty Aghajanyan décrit en fait les risques possibles.
andree
@andree merci d'avoir signalé ma faute de frappe. C'est un poste vieux de 3 ans. De toute évidence, il existe des moyens de contourner ce que React échappe et chaque développeur devrait en avoir assez.
John Ruddell
Merci d'avoir édité votre réponse @John Ruddell. Aucune offense, mais votre réponse a rendu React plus sûr qu'il ne l'est en réalité, et comme votre réponse est l'une des premières à aborder le sujet, je voulais juste le souligner. Malheureusement, c'est un thème commun que je vois dans la sécurité globale du frontend (pas seulement React) - les choses semblent sécurisées ou facilement sécurisables en surface, mais lorsque vous creusez, il s'avère qu'il y a de gros trous. Les questions de sécurité de base devraient avoir des réponses faciles à trouver qui sont résumées quelque part, malheureusement ce n'est pas mon expérience ces derniers temps.
andree
Eh bien ... au fil du temps, la documentation sort au fur et à mesure des tests de sécurité. Les réponses que nous avons une fois utiles ne sont pas aussi utiles. La partie difficile est de garder toutes les réponses à jour avec l'évolution de la technologie
React échappe automatiquement les variables pour vous ... Il empêche l'injection XSS via une chaîne HTML avec Javascript malveillant .. Naturellement, les entrées sont nettoyées avec cela.
Par exemple, disons que vous avez cette chaîne
si vous essayez de rendre cette chaîne en react
vous verrez littéralement sur la page toute la chaîne, y compris la
<span>
balise d'élément. aka dans le navigateur, vous verrez<img src="javascript:alert('XSS!')" />
si vous affichez le code source html, vous verriez
Voici quelques détails supplémentaires sur ce qu'est une attaque XSS
React fait que vous ne pouvez pas insérer de balisage à moins que vous ne créiez les éléments vous-même dans la fonction de rendu ... cela étant dit, ils ont une fonction qui permet un tel rendu, c'est appelé
dangerouslySetInnerHTML
... voici plus de détails à ce sujetÉditer:
Peu de choses à noter, il existe des moyens de contourner ce que React échappe. Une méthode plus courante consiste à définir des accessoires pour votre composant. N'étendez pas les données de l'entrée utilisateur comme accessoires!
la source