web-dev-qa-db-fra.com

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

J'enregistre le code HTML soumis par l'utilisateur (dans une base de données). Je dois empêcher 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 utilisateur valide comprendra des caractères spéciaux et des constructions XML, donc je voudrais éviter une approche de liste blanche si possible. (Liste de chaque élément et attribut HTML autorisé).

Voici des exemples de chaînes d'attaque Javascript:

1)

"Bonjour, j'ai un problème d'alerte <script> (" mauvais! ") </script> avec l'élément <dog> ..."

2)

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

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

Jusqu'à présent, la seule solution consiste à utiliser une expression régulière pour supprimer certains modèles. Il résout le cas 1, mais pas le cas 2.

Edit: Désolé, j'ai oublié 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 requête HTTP.

Modifier 2:

Merci pour les liens tout le monde. En supposant que je puisse définir ma liste (le contenu comprendra de nombreuses constructions mathématiques et de programmation, donc une liste blanche va être très ennuyeuse), j'ai encore une question ici:

Quel type d'analyseur me permettra de supprimer simplement les "mauvaises" pièces? La mauvaise partie pourrait être un élément entier, mais qu'en est-il de ces scripts qui résident dans les attributs. Je ne peux pas supprimer <a hrefs> bon gré mal gré.

52

Tu crois que c'est ça? Vérifiez ceci .

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

[~ # ~] éditez [~ # ~] :

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 a été écrit pour analyser le HTML affiché sur ce site: lien Archive.org - vous devrez peut-être changer cela parce que votre liste blanche est plus grande, mais cela devrait vous aider à démarrer.

36
Paolo Bergantino

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

Rien de moins et vous vous ouvrez à des problèmes - des exploits connus ou ceux qui seront découverts à l'avenir.

7
BarelyFitz

La seule façon vraiment sûre de procéder est d'utiliser une liste blanche. Encodez tout, puis reconvertissez les codes autorisés.

J'ai vu des tentatives assez avancées pour interdire uniquement le code dangereux, et cela ne fonctionne toujours pas bien. C'est tout un exploit d'essayer d'attraper en toute sécurité tout auquel tout le monde peut penser, et il est enclin à remplacer de façon ennuyeuse certaines choses qui ne sont pas dangereuses du tout.

4
Guffa

Fondamentalement, comme l'a dit Paolo, 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 sont pas censés faire.

Gardez une liste des balises HTML autorisées (des choses comme b, i, u ...) et filtrez tout le reste. Vous souhaiterez probablement également supprimer tous les attributs des balises HTML autorisées (à cause de votre deuxième exemple, par exemple).

Une autre solution serait d'introduire ce que l'on appelle le code BB, ce que beaucoup de forums utilisent. Il a une syntaxe similaire à HTML, mais commence avec l'idée d'une liste blanche de code autorisé, qui est ensuite transformé en HTML. Par exemple, [b] exemple [/ b] entraînerait exemple. Assurez-vous lors de l'utilisation du code BB de filtrer toujours les balises HTML à l'avance.

3
Aistina

Actuellement, la meilleure option consiste à utiliser un en-tête Politique de sécurité du conten comme ceci:

Content-Security-Policy: default-src 'self';

Cela empêchera le chargement des scripts, styles, images, etc. en ligne et externes, donc seules les ressources de la même origine seront chargées et exécutées par le navigateur.

Cependant, cela ne fonctionnera pas sur les anciens navigateurs.

2
Adam

quel code côté serveur utilisez-vous? Selon le nombre ou les façons dont vous pouvez filtrer les scripts malveillants, il s'agit d'un territoire dangereux. Même les professionnels chevronnés se font prendre: http://www.codinghorror.com/blog/archives/001167.html

0
Chris Simpson