Question

Je ne suis pas préoccupé par d'autres types d'attaques.Je veux juste savoir si le HTML Codent peuvent prévenir tous les types d'attaques XSS.

Est-il possible de faire une attaque XSS même si de codage HTML est utilisé?

Était-ce utile?

La solution

Pas de.

En mettant de côté le sujet de permettre à certains tags (pas vraiment le point de la question), HtmlEncode simplement ne couvre PAS toutes les attaques XSS.

Par exemple, considérons générée par le serveur javascript côté client - le serveur de façon dynamique sorties htmlencoded des valeurs directement dans le code javascript côté client, htmlencode va ne pas arrêter injecté script de s'exécuter.

Ensuite, prenez en compte le pseudo-code suivant:

<input value=<%= HtmlEncode(somevar) %> id=textbox>

Maintenant, dans le cas de ses pas immédiatement évident, si somevar (envoyé par l'utilisateur, bien sûr) est fixé par exemple à

a onclick=alert(document.cookie)

le résultat est

<input value=a onclick=alert(document.cookie) id=textbox>

ce qui serait clairement le travail.Bien évidemment, cela peut être (presque) n'importe quel autre script...et HtmlEncode serait pas d'une grande aide.

Il y a quelques autres vecteurs être considéré comme...y compris le troisième saveur de XSS, appelé DOM-base XSS (dans lequel le script malveillant est généré dynamiquement sur le client, par ex.basé sur # les valeurs).

Aussi, n'oubliez pas l'UTF-7 type d'attaques, où l'attaque ressemble

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

Rien de bien coder là...

La solution, bien sûr (en plus de la bonne et restrictive blanc-entrée de la liste de validation), est à effectuer sensible au contexte encodage:HtmlEncoding est génial SI vous êtes un contexte de sortie HTML, ou peut-être vous avez besoin JavaScriptEncoding, ou VBScriptEncoding, ou AttributeValueEncoding, ou...etc.

Si vous êtes à l'aide de MS ASP.NET, vous pouvez utiliser l'Anti-XSS Bibliothèque, qui offre tout le nécessaire du contexte des méthodes de codage.

Notez que tous encodage ne devrait pas être limitée à la saisie de l'utilisateur, mais aussi de valeurs stockées dans la base de données, des fichiers texte, etc.

Oh, et n'oubliez pas explicitement définir le jeu de caractères, à la fois dans l'en-tête HTTP ET la balise META, sinon vous aurez toujours UTF-7 vulnérabilités...

Certains plus d'informations, et une jolie liste définitive (constamment mis à jour), découvrez RSnake de la Feuille de Triche: http://ha.ckers.org/xss.html

Autres conseils

Si vous systématiquement encoder toutes les entrées utilisateur avant de les afficher alors oui, vous êtes en sécurité vous n'êtes toujours pas sûr à 100%.
(Voir @Avid post pour plus de détails)

En plus des problèmes surviennent lorsque vous avez besoin de laisser certains tags aller non codée de sorte que vous autorisez les utilisateurs à poster des images ou du texte en gras ou toute fonction qui nécessite la saisie de l'utilisateur d'être traités comme tel (ou converti) non codée de balisage.

Vous avez à mettre en place un système de prise de décision pour décider lequel des balises sont permises et celles qui ne le sont pas, et il est toujours possible que quelqu'un va trouver un moyen pour permettre à un non autorisés balise de passer à travers.

Il aide si vous suivez les conseils de Joel de De Faire Les Mauvais Code Regarde Mal ou si votre langue, vous aide à par avertissement/pas de compilation lorsque vous générez des non transformés, les données de l'utilisateur (statique-typage).

Si vous encodez tout ce qu'il sera.(en fonction de votre plate-forme et la mise en œuvre de htmlencode) Mais tout utile application web est tellement complexe qu'il est facile d'oublier de vérifier chaque partie.Ou peut-être un 3ème partie de la composante n'est pas sûr.Ou peut-être un chemin de code que vous avez bien fait de codage de ne pas le faire si vous avez oublié quelque part d'autre.

De sorte que vous pouvez vérifier les choses sur le côté de l'entrée aussi.Et vous pourriez vouloir vérifier trucs que vous lisez à partir de la base de données.

Comme mentionné par tout le monde, vous êtes en sécurité aussi longtemps que vous encodez tous la saisie de l'utilisateur avant de l'afficher.Cela inclut tous les paramètres de la requête et les données extraites de la base de données qui peut être changé par l'utilisateur.

Comme mentionné par Pat vous aurez parfois envie d'affichage de certaines balises, tout simplement pas toutes les balises.Une façon courante de le faire est d'utiliser un langage de balisage comme Textile, Markdown, ou BBCode.Cependant, même des langages de balisage peuvent être vulnérables aux attaques de type XSS, juste être conscient.

# Markup example
[foo](javascript:alert\('bar'\);)

Si vous décidez de laisser "safe" les étiquettes à travers je le recommande à trouver de la bibliothèque existante pour analyser & désinfecter votre code avant la sortie.Il y a beaucoup de XSS vecteurs que vous auriez à détecter avant votre désinfectant est assez sûr.

Je seconde metavida de conseils pour trouver une bibliothèque tierce, à la poignée de sortie de filtrage.Neutraliser les caractères HTML est une bonne approche pour arrêter les attaques XSS.Toutefois, le code que vous utilisez pour transformer les caractères de remplacement peuvent être vulnérables à l'évasion des attaques;par exemple, si elle ne gère pas correctement les caractères Unicode et l'internationalisation.

Un classique simple erreur homebrew filtres en sortie à faire est de prendre seulement < et >, mais manquer des choses comme ", qui peut se briser contrôlée par l'utilisateur sortie dans l'attribut de l'espace d'une balise HTML, où le Javascript peut être attaché à la DOM.

Non, juste l'encodage HTML communs des jetons de NE PAS complètement protéger votre site contre les attaques XSS.Voir, par exemple, cette vulnérabilité XSS trouvé dans google.com:

http://www.securiteam.com/securitynews/6Z00L0AEUE.html

La chose importante à propos de ce type de vulnérabilité est que l'attaquant est capable d'encoder sa XSS charge l'utilisation de l'UTF-7, et si vous n'avez pas spécifié un autre codage de caractères sur votre page, le navigateur d'un utilisateur peut interpréter l'UTF-7 de la charge utile et d'exécuter l'attaque de script.

Une autre chose que vous devez vérifier est l'endroit où vos données proviennent des.Vous pouvez utiliser le référent de la chaîne (la plupart du temps) pour vérifier que c'est à partir de votre propre page, mais de la mise caché dans un nombre aléatoire ou quelque chose dans votre formulaire, puis de le vérifier (avec une session de définir une variable peut-être) contribue également sachant que l'entrée est à venir à partir de votre propre site et pas sur un site de phishing.

Je voudrais suggérer HTML Purificateur (http://htmlpurifier.org/) Il n'est pas juste de filtrer le html, il tokenizes et re-compile.C'est vraiment de force industrielle.

Il a l'avantage supplémentaire de permettre de vous assurer valide en html/xhtml sortie.

Aussi n le'chose textile, c'est un outil formidable et je l'utilise tout le temps, mais je passerais bien html purificateur trop.

Je ne pense pas que vous avez compris ce que je voulais re jetons.HTML Purificateur n'est pas seulement "filtre", il reconstitue le html. http://htmlpurifier.org/comparison.html

Je ne le crois pas.De codage Html convertit tous les caractères qui pourrait être interprété par le navigateur comme code) de références à des entités qui ne peuvent pas être analysés par le navigateur, et donc, ne peut pas être exécutée.

&lt;script/&gt;

Il n'y a aucun moyen que le ci-dessus peut être exécuté par le navigateur.

** * À moins que leur est un bug dans le navigateur, bien sûr.*

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top