Comment prévenir les attaques de type XSS (Cross Site Scripting) tout en permettant une entrée HTML
J'ai un site internet qui permet d'entrer en HTML par le biais d'un De TinyMCE riche éditeur de contrôle. Son but est de permettre aux utilisateurs de formater le texte à l'aide de HTML.
Cet utilisateur a entré le contenu est ensuite retournée à d'autres utilisateurs du système.
Cependant, cela signifie que quelqu'un pourrait insérer du code JavaScript dans le code HTML afin d'effectuer une attaque XSS sur les autres utilisateurs du système.
Quelle est la meilleure façon de filtrer code JavaScript à partir d'une chaîne HTML?
Si j'effectue une Expression Régulière pour vérifier <SCRIPT>
les balises c'est un bon début, mais un méchant pourrait encore se joindre JavaScript pour la onclick
attribut d'une balise.
Est-il un moyen infaillible de script tout code JavaScript, tout en laissant le reste de l'HTML intacte?
Pour mon application, j'utilise C#
dans mon cas particulier, je suis en utilisant asp.net/C#
double possible de Désinfection d'entrée HTML
OriginalL'auteur Peter Bridger | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
Microsoft ont produit leurs propres anti-XSS bibliothèque, Microsoft Anti-Cross Site Scripting Library V4.0:
Il utilise une liste blanche approche de la bande de potentiel de XSS contenu.
Voici quelques liens pertinents liés à anti-xss:
Pour info: Aucun des ci-dessus sont en cours de développement, et de plus, j'ai lu des commentaires d'ailleurs que les anti-xss n'est pas bien mis en œuvre.
OriginalL'auteur Peter Bridger
Pierre, j'aimerais vous présenter deux concepts en matière de sécurité;
Liste noire - Interdire des choses que vous savez qu'elles sont mauvaises.
Blanche - Permettre des choses que vous connaissez sont bonnes.
Alors que les deux ont leurs usages, liste noire est dangereux de par leur conception.
Ce que vous demandez, est en fait la mise en liste noire. Si il y avait une alternative à
<script>
(comme<img src="bad" onerror="hack()"/>
), vous ne serez pas en mesure d'éviter ce problème.La liste blanche, d'autre part, permet de préciser les conditions vous le permettent.
Par exemple, vous avez les règles suivantes:
C'est juste de la théorie. Dans la pratique, vous devez analyser le code HTML en conséquence, d'où la nécessité d'un bon analyseur HTML.
Vous pouvez mettre du javascript dans de la src et de href.
C'est une autre règle, concernant la balise contenu. J'ai parlé de balises et leurs attributs, et non le contenu. Le point est, alors que
href
/src
sont utiles,onclick
ne l'est pas.OriginalL'auteur Christian
Si vous souhaitez autoriser le HTML mais pas toutes, vous devriez utiliser quelque chose comme l'OWASP AntiSamy, qui vous permet de créer une liste blanche de la politique sur lequel les balises et les attributs de vous permettre.
HTMLPurifier pourrait aussi être une alternative.
Il est d'une importance cruciale que c'est une liste blanche approche, de nouveaux attributs et des événements sont ajoutés à HTML5 tout le temps, de sorte que toute la mise en liste noire serait un échec au sein de court laps de temps, et sachant que tous les "mauvais" attributs est également difficile.
Edit: Oh, et regex est un peu dur à faire ici. HTML pouvez avoir beaucoup de formats différents. Les balises peuvent être clôturés, les attributs pouvez commencer avec ou sans guillemets (simples ou doubles), vous pouvez faire des sauts de ligne et tous les types d'espaces dans les balises de nom à quelques questions. Je voudrais compter sur un welltested bibliothèque comme ceux que j'ai mentionnés ci-dessus.
OriginalL'auteur Erlend
Les expressions régulières ne sont pas le bon outil pour le travail, vous avez besoin d'un véritable analyseur HTML ou les choses vont mal tourner. Vous devez analyser le code HTML de chaîne, puis supprimez tous les éléments et attributs mais autorisés (liste blanche approche, les listes noires sont intrinsèquement précaire). Vous pouvez prendre les listes utilisées par Mozilla comme un point de départ. Là, vous avez également une liste d'attributs qui prennent des valeurs d'URL - vous besoin de vérifier que ceux-ci sont soit des Url relatives ou utiliser un protocole (en général, uniquement
http:
/https:
/ftp:
, en particulier, aucunejavascript:
oudata:
). Une fois que vous avez retiré tout ce qui n'est pas autorisée, vous sérialiser vos données au format HTML - maintenant, vous avez quelque chose qui est sûr pour l'insérer sur votre page web.<head>
hacks n'avez même pas besoinjavascript:
Droit, de sorte que vous downvote une réponse tout simplement parce que vous n'avez pas le temps de le lire... bien sûr, il n'protéger contre ces vecteurs - c'est pourquoi j'ai recommandé à l'aide d'un analyseur HTML. Une fois que vous parser le HTML et le sérialiser correctement tout le code HTML non valide entrée problèmes "automatiquement". Et la suppression de tous les éléments et les attributs qui ne sont pas explicitement autorisé est assez bon pour le rendre sûr. En prenant soin de
javascript:
est seulement la dernière étape. Que pensez-vous de comment HTML Purificateur d'œuvres?Vous suggérez OP rouler son propre code HTML de l'assainissement qui est suicidaire dans cette journée et l'âge.
Non, je vais expliquer comment une solution qui fonctionne. Si l'OP lit et décide d'utiliser une solution existante - grand. Mais pour comprendre ce qu'il fait est toujours crucial, en l'utilisant comme un enchantement que la magie de résoudre votre problèmes susceptibles de mener à des problèmes de sécurité à nouveau. Ne pas mentionner que votre solution proposée ne fonctionne que pour le PHP, mais l'OP est l'aide de ASP.net/C#.
Ahh le C# a été ajouté après ma réponse
OriginalL'auteur Wladimir Palant
J'ai essayer de remplacer l'élément d'étiquette de format comme ceci:
Utilisation avant d'enregistrer dans la base de données:
J'ai test que j'ai données d'entrée comme :
il sera exécuté sur le navigateur. Après l'ajout de l'Anti XSS le code ci-dessus seront:
(Il y a un espace après
<
)Et le résultat, le script ne sera pas exécuté sur le navigateur.
OriginalL'auteur toha