2010-05-05 15 views
6

Je suis en train de coder un éditeur WYSIWYG largeur designMode = "on" sur un iframe. L'éditeur fonctionne bien et je stocke le code tel qu'il est dans la base de données. Avant de sortir le code HTML, j'ai besoin de "nettoyer" avec php côté serveur pour éviter les scripts intersites et d'autres choses effrayantes. Y at-il une sorte de meilleure pratique sur la façon de faire cela? Quelles balises peuvent être dangereuses?Meilleure pratique: Nettoyage HTML généré par l'utilisateur

MISE À JOUR: la faute de frappe, c'est ce que vous voyez est ce que vous obtenez. Rien de nouveau :)

+0

Si vous êtes déterminé à l'implémenter vous-même, vous devriez jeter un oeil à http://ha.ckers.org/xss.html - une liste d'attaques connues dans divers navigateurs. – FalseVinylShrub

+0

Bonne question - Je me demande comment stackoverflow se protège ... – JDelage

Répondre

5

La meilleure pratique est de ne permettre que certaines choses que vous savez ne sont pas dangereuses, et supprimer/échapper tout le reste. Voir l'article Automated Malicious Code Detection and Removal on the Web (OWASP AntiSamy) pour une discussion à ce sujet (la bibliothèque est pour Java, mais les principes s'appliquent à n'importe quelle langue).

+0

J'ai commencé comme ça, mais comme tous les navigateurs implémentent ce truc différemment, j'obtiendrai beaucoup de tags pour la même chose que ce que je dois autoriser. Par exemple, le texte en gras est fait d'au moins 3 façons différentes. Ce sera donc un énorme ensemble de regex. Il est également possible de coller dans n'importe quel format html que vous voulez dans l'éditeur, comme dans un html-mail ou autre. Et cela semble bien dans l'éditeur, mais ne fonctionnera pas après l'évasion. – Martin

+1

C'est pourquoi AntiSamy est déjà livré avec quelques exemples de jeux. Probablement, il y a aussi une librairie PHP (ou vous pouvez en créer une?) Vous ne l'atteindrez jamais (en blacklistant): Tous ceux qui ont déjà essayé ça ont échoué - ce n'est tout simplement pas réalisable - il y aura * être quelque chose que vous n'avez pas couvert (ce qui est fatal pour la liste noire, mais n'a pas trop d'importance lors de la liste blanche). Idéalement, si vous pouvez éviter HTML, utilisez Markdown etc., comme suggéré par Hank! –

+1

@Martin vous * VRAIMENT * ne devrait pas utiliser les regex pour cela. Il y a une raison [cette réponse] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) obtenu (net) 3000 upvotes. –

0

Si vous êtes familier avec ASP .NET, exécutez simplement un fichier Server.htmlencode() pour convertir des caractères spéciaux comme <> en "& g t;" "& l t;"

En php, vous pouvez utiliser les fonctions htmlspecialchars(). Une fois les caractères spéciaux codés, il est possible d'empêcher la création de scripts inter-sites.

+0

Mais cela désactive html, je veux autoriser le HTML mais supprimer les balises dangereuses comme iframe et script. – Martin

+0

Ensuite, utilisez un balisage spécialement conçu pour le prupose comme bbcode ou wikicode et un éditeur approprié. – symcbean

3

Si vous êtes vraiment décidé à autoriser cela, vous devez utiliser une approche de liste blanche. La meilleure approche est probablement d'interdire HTML et d'utiliser un format de balisage simplifié à la place; vous pouvez pré-rendre au HTML et stocker dans la base de données si la performance est une préoccupation. Éviter ce genre de problèmes est l'une des grandes raisons d'utiliser Markdown, Textile, reStructuredText, etc.

NOTE: Je lié à GitHub-aromatisée Markdown (GFM), non standard Markdown (SM). GFM résout certains problèmes courants rencontrés par les utilisateurs finaux avec SM.

1

J'ai récemment examiné la même question avec Perl que le langage côté serveur. Ce faisant, je suis tombé sur HTML Purifier ce qui peut être ce que vous voulez. Mais évidemment, comme c'est en PHP et pas en Perl, je n'ai pas vraiment testé. En outre, dans mes recherches, je suis arrivé à la conclusion qu'il s'agit d'une entreprise très délicate et que je considère si possible utiliser un langage de balisage simplifié comme Markdown, comme suggéré par Hank Gay.