XSS de la prévention et de la .innerHTML
Quand j'permettre aux utilisateurs d'insérer des données en tant qu'argument à la JS innerHTML
fonction comme ceci:
element.innerHTML = “User provided variable”;
J'ai compris que pour éviter les attaques de type XSS, j'ai du codage HTML, et puis JS coder l'entrée de l'utilisateur, car l'utilisateur peut insérer quelque chose comme ceci:
<img src=a onerror='alert();'>
Que du HTML ou seulement JS encodage ne serait pas d'aide parce que la .innerHTML
méthode que j'ai compris décode l'entrée avant de l'insérer dans la page. Avec HTML+JS encodage, j'ai remarqué que le .innerHTML
décode le JS, mais le codage HTML le reste.
Mais j'ai été en mesure d'atteindre le même en double codage en HTML.
Ma question est: quelqu'un Pourrait fournir un exemple de pourquoi je devrais HTML coder et coder en JS, et pas le double de coder en HTML lors de l'utilisation de la .innerHTML
méthode?
Vous devez vous connecter pour publier un commentaire.
Sûr.
En supposant que "l'utilisateur a fourni des données" est renseignée dans votre JavaScript par le serveur, alors vous allez avoir à coder en JS pour l'obtenir il.
Ce qui suit est de pseudo sur le serveur-côté de la fin, mais en JavaScript sur le front-end:
Comme ASP.NET
<%= %>
sorties de la variable côté serveur sans codage. Si l'utilisateur est "bon" et fournit la valeurfoo
, alors il en résulte dans le code JavaScript suivant en cours de rendu:Jusqu'à présent pas de problèmes.
Maintenant dire à un utilisateur malveillant fournit la valeur
"; alert("xss attack!");//
. Ce serait être traduit comme:qui entraînerait une XSS exploiter lorsque le code est exécuté dans la première ligne de la ci-dessus.
Pour éviter cela, comme vous le dites vous JS encoder. Le OWASP XSS prévention de la feuille de triche règle #3 dit:
Afin de les protéger contre cette, votre code peut être
où
JsEncode
encode par l'OWASP recommandation.Cela permettrait d'éviter l'attaque ci-dessus, comme il le ferait maintenant rendu comme suit:
Maintenant que vous avez sécurisé votre JavaScript affectation de variable contre XSS.
Cependant, si un utilisateur malveillant fourni
<img src="xx" onerror="alert('xss attack')" />
que la valeur? Ce serait bien pour l'affectation de variable puisqu'elle serait tout simplement converti dans l'hexagone entité équivalente, comme ci-dessus.Toutefois la ligne
serait la cause de
alert('xss attack')
être exécutée lorsque le navigateur rend l'intérieur HTML. Ce serait un DOM Basé XSS attaque.C'est pourquoi vous avez besoin de codage HTML aussi. Ceci peut être fait via une fonction telle que:
rendre votre code
ou pourrait être fait via JQuery
text()
fonction.Mise à jour au sujet de la question dans les commentaires
Je vais prendre votre question de la manière suivante: Plutôt que de JS encodage, suivi par le codage HTML, pourquoi ne pas nous ne vous contentez pas de codage HTML, en premier lieu, et de la laisser à qui?
Bien parce qu'ils pourraient coder une attaque comme
<img src="xx" onerror="alert('xss attack')" />
tous encodés à l'aide de la\xHH
format pour insérer leur charge utile - ce le HTML de la séquence de l'attaque sans l'aide de l'un des personnages que le codage HTML touchera.Il y a quelques autres attaques trop: Si l'attaquant est entré
\
alors qu'ils pourraient forcer le navigateur à manquer au cours de clôture (en tant que\
est le caractère d'échappement en JavaScript).Cela rendrait comme:
qui déclencherait une erreur JavaScript, car il n'est pas fermé correctement à l'instruction. Cela pourrait provoquer un Déni de Service à la demande s'il est rendu dans un endroit bien en vue.
En outre dire qu'il y avait deux morceaux de contrôlé par l'utilisateur de données:
l'utilisateur peut alors entrer
\
dans la première et la;alert('xss');//
dans le second. Ce serait changer la concaténation de chaîne dans une grande affectation, suivi par une attaque XSS:À cause de bord de tels cas, il est recommandé de suivre l'OWASP de lignes directrices, ils sont aussi près à l'épreuve des balles que vous pouvez obtenir. Vous pourriez penser que l'ajout de
\
à la liste de HTML codé valeurs résout ce, cependant, il existe d'autres raisons d'utiliser JS suivie par HTML lors du rendu du contenu de cette manière parce que cette méthode fonctionne également pour les données dans les valeurs de l'attribut:Malgré si elle est simple ou double cité:
Ou même non cotées:
Si vous HTML encodé comme mentionné dans votre commentaire une entité valeur:
onclick='var userProdividedData ="";"'
(version abrégée)le code est exécuté par le navigateur de l'analyseur HTML en premier, afin de
userProdividedData
seraitau lieu de
ainsi, lorsque vous l'ajouter à la
innerHTML
vous appeler aurait XSS de nouveau. Notez que<script>
les blocs ne sont pas traitées via le navigateur de l'analyseur HTML, sauf pour la clôture de l'</script>
tag, mais c'est une autre histoire.Il est toujours sage de coder comme fin que possible comme indiqué ci-dessus. Alors si vous avez besoin à la sortie de la valeur dans un autre contexte JavaScript (par exemple, une véritable boîte d'alerte n'a pas de rendu HTML, alors il sera toujours afficher correctement).
Qui est, avec ce qui précède, je peux appeler
tout aussi facilement comme paramètre HTML
Dans les deux cas, il s'affiche correctement sans certains caractères de perturber le fonctionnement de la sortie ou de causer des indésirables exécution de code.
"; alert("xss attack!");//
. Mais si nous utilisons le codage HTML au lieu de JS encodage, ne serait-ce pas également de codage HTML " le signe et la faire cette attaque impossible parce que l'on a:var userProdividedData =""; alert("xss attack!");//";
Un moyen simple de s'assurer que les contenus de votre
element
est codé correctement (et ne seront pas considérés comme des fichiers HTML) est d'utilisertextContent
au lieu deinnerHTML
:Une autre option est d'utiliser
innerHTML
seulement après que vous avez encodé (de préférence sur le serveur si vous avez la chance) les valeurs que vous souhaitez utiliser.J'ai été confronté à ce problème dans ma ASP.NET Formulaires de demande. Le correctif pour ce qui est relativement simple.
Installer HtmlSanitizationLibrary de Gestionnaire de Package NuGet et consultez-le dans votre demande. Le code derrière, veuillez utiliser le désinfectant de classe de la manière suivante.
Par exemple, si le code actuel ressemble à quelque chose comme cela,
Ensuite, le remplacer par le suivant:
Ce correctif va supprimer la Veracode vulnérabilité et assurez-vous que la chaîne est rendu au format HTML. L'encodage de la chaîne au code derrière le rendre comme 'non-chaîne codée" plutôt que du HTML BRUT, comme il est codé avant le rendu commence.