Comment empêcher les attaques d'injection Javascript dans le HTML généré par l'utilisateur

Je sauvegarde le HTML envoyé par l'utilisateur (dans une base de données). Je dois éviter les attaques par injection Javascript. Le plus pernicieux que j'ai vu est le script dans un style = "expression (…)".

En plus de cela, une bonne quantité de contenu d'utilisateur valide comprendra des caractères spéciaux et des constructions XML, alors je souhaite éviter une approche en liste blanche si possible. (Liste tous les éléments et attributs HTML admissibles).

Des exemples de chaînes d'attaque Javascript sont:

1)

"Bonjour, j'ai une alerte <script> (" mauvaise! ") </ Script> avec l'élément <dog> …"

2)

"Salut, cette <b style =" width: expression (alert ('bad!')) "> Dog </ b> est noir."

Existe-t-il un moyen d'empêcher ce Javascript, et laisser le reste intact?

La seule solution que j'ai à présent est d'utiliser une expression régulière pour supprimer certains motifs. Il résout le cas 1, mais pas le cas 2.

Edit: Désolé, oubliez de mentionner l'environnement – c'est essentiellement la pile MS:

  • SQL Server 2005
  • C # 3.5 (ASP.NET)
  • Javascript (évidemment) et jQuery.

Je voudrais que le chokepoint soit la couche ASP.NET – n'importe qui peut créer une mauvaise demande HTTP.

Modifier 2:

Merci pour tous les liens. En supposant que je peux définir ma liste (le contenu inclura de nombreuses constructions mathématiques et de programmation, donc une liste blanche va être très ennuyante) J'ai encore une question ici:

Quel type d'analyseur m'a-t-il permis d'enlever les «mauvaises» pièces? La mauvaise partie pourrait être un élément entier, mais qu'en est-il des scripts qui résident dans les attributs. Je ne peux pas supprimer <a hrefs> willy-nilly.

Vous pensez que c'est ça? Vérifiez ceci .

Quelle que soit l'approche que vous prenez, vous devez absolument utiliser une liste blanche. C'est le seul moyen de se rapprocher de ce que vous autorisez sur votre site.

EDIT :

Je ne suis pas familier avec .NET, malheureusement, mais vous pouvez vérifier la propre bataille de stackoverflow avec XSS ( http://blog.stackoverflow.com/2008/06/safe-html-and-xss/ ) et le code qui était Écrit pour analyser HTML publié sur ce site: lien Archive.org – évidemment, vous devrez peut-être changer cela car votre liste blanche est plus grande, mais cela devrait vous aider à démarrer.

La liste blanche pour les éléments et les attributs est le seul choix acceptable à mon avis. Tout ce qui ne figure pas sur votre liste blanche devrait être supprimé ou encodé (modifier <> & "pour les entités). Assurez-vous également de vérifier les valeurs dans les attributs que vous autorisez.

Quelque chose de moins et vous vous ouvrez aux problèmes – des exploits connus ou ceux qui seront découverts dans le futur.

Le seul moyen vraiment sécurisé d'utiliser une liste blanche. Encodez tout, puis convertissez les codes autorisés.

J'ai vu des tentatives assez avancées pour ne pas autoriser le code dangereux, et cela ne fonctionne toujours pas bien. C'est tout un exploit pour essayer d'attraper tout ce que n'importe qui peut penser, et il est enclin à faire des remplacements ennuyeux de certaines choses qui ne sont pas du tout dangereuses.

Fondamentalement, comme Paolo l'a dit, vous devriez essayer de vous concentrer sur ce que les utilisateurs sont autorisés à faire, plutôt que d'essayer de filtrer les choses qu'ils ne devraient pas faire.

Gardez une liste des balises HTML autorisées (choses comme b, i, u …) et filtrez tout le reste. Vous voulez probablement supprimer tous les attributs des balises HTML autorisées (par exemple, par exemple).

Une autre solution serait d'introduire le soi-disant code BB, ce que beaucoup de forums utilisent. Il a une syntaxe similaire à HTML, mais commence par l'idée d'une liste blanche du code autorisé, qui est ensuite transformé en HTML. Par exemple, [b] exemple [/ b] aboutirait à un exemple . Assurez-vous que lorsque vous utilisez le code BB pour filtrer les tags HTML à l'avance.

Quel code côté serveur utilises-tu? Selon quels sont les numéros ou les moyens, vous pouvez filtrer les scripts malveillants, mais c'est un territoire dangereux. Même les proffesionals chevronnés sont pris au piège: http://www.codinghorror.com/blog/archives/001167.html

Vous pouvez utiliser cette fonction de restriction.

 function restrict(elem){ var tf = _(elem); var rx = new RegExp; if(elem == "email"){ rx = /[ '"]/gi; }else if(elem == "search" || elem == "comment"){ rx = /[^az 0-9.,?]/gi; }else{ rx = /[^a-z0-9]/gi; } tf.value = tf.value.replace(rx , "" ); }