61 votes

Comment prévenir les attaques par injection Javascript dans le code HTML généré par l'utilisateur

Je suis d'économie soumis par l'utilisateur HTML (dans une base de données). Je dois prévenir les attaques par injection de code Javascript. Le plus pernicieux que j'ai vu, c'est le script dans un style="expression(...)".

En plus de cela, une bonne quantité de l'utilisateur valide le contenu inclura des caractères spéciaux et des constructions XML, donc je voudrais l'éviter en blanc de la liste si possible. (Une liste de tous les admissibles éléments et d'attributs HTML).

Exemples de Javascript attaque les cordes sont:

1)

"Bonjour, j'ai un <script>alert("le mal!")</script> problème avec le <chien> élément..."

2)

"Salut, c' <b style="width:expression(alert('mauvais!'))">chien</b> est noir."

Est-il un moyen de prévenir de tels Javascript, et de laisser le reste intact?

La seule solution que j'ai pour l'instant est d'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 MS de la pile:

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

Je voudrais que le goulet d'étranglement à l'ASP.NET couche - n'importe qui peut fabriquer une mauvaise requête HTTP.

Edit 2:

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

Ce type d'analyseur me permettra seulement de supprimer les "mauvais" pièces? La mauvaise partie pourrait être un élément entier, mais alors que penser de ces scripts qui se trouvent dans les attributs. Je ne peux pas supprimer < a hrefs > bon gré mal gré.

44voto

Paolo Bergantino Points 199336

Vous pensez que c'est ça? Check this out.

Quelle que soit l'approche que vous prenez, vous avez certainement besoin d'utiliser une liste blanche. C'est le seul moyen à même de venir près d'être sûr de ce que vous êtes en permettant à votre site.

EDIT:

Je ne suis pas familier avec .NET, malheureusement, mais vous pouvez vérifier sur stackoverflow propre bataille avec XSS (http://blog.stackoverflow.com/2008/06/safe-html-and-xss/) et le code qui a été écrit pour analyser HTML affiché sur ce site (http://refactormycode.com/codes/333-sanitize-html) - évidemment, vous pourriez avoir besoin de changer parce que votre liste blanche est plus grand, mais qui devrait vous obtenir a commencé.

8voto

BarelyFitz Points 1196

Liste blanche pour les éléments et attributs est le seul choix acceptable à mon avis. Ce qui n'est pas sur votre liste blanche devraient être supprimés ou codé (changement <>&" à des entités). Assurez-vous également de vérifier les valeurs dans les attributs que vous voulez autoriser.

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

Voir aussi: XSS (Cross Site Scripting) Feuille de Triche

4voto

Guffa Points 308133

Le seul moyen vraiment sûr est d'utiliser une liste blanche. Tout encoder, puis reconvertit les codes autorisés.

J'ai vu des tentatives assez avancées pour interdire uniquement les codes dangereux, et cela ne fonctionne toujours pas bien. C’est un exploit de tenter d’attraper en toute sécurité tout ce à quoi tout le monde peut penser, et il est sujette de faire des remplacements agaçants de certaines choses qui ne sont pas du tout dangereuses.

3voto

Aistina Points 6720

Dans le fond, Paolo dit, vous devriez essayer de se concentrer sur ce que les utilisateurs sont autorisés à le faire, plutôt que d'essayer de filtrer les trucs qu'ils ne sont pas censés faire.

Conservez une liste de balises HTML (des choses comme b, i, u...) et de filtrer tout le reste. Vous avez sans doute aussi de vouloir supprimer tous les attributs pour le permis de balises HTML (à cause de votre deuxième exemple, par exemple).

Une autre solution serait d'introduire soi-disant BB code, qui est ce que beaucoup de forums utilisation. Il a la même syntaxe HTML, mais commence avec l'idée d'une liste blanche de permis code, qui est ensuite transformé en HTML. Par exemple, [b]exemple[/b] entraînerait exemple. Assurez-vous que lors de l'utilisation de BB code pour toujours filtrer les balises HTML à l'avance.

0voto

Chris Simpson Points 3894

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X