Meilleure pratique: nettoyage HTML généré par l'utilisateur

Je code un éditeur de WYSIWYG design de largeurMode = "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 produire le html, je dois "nettoyer" avec php sur le côté serveur pour éviter les scripts entre sites et d'autres choses effrayantes. Existe-t-il une sorte de pratique exemplaire sur la façon de procéder? Quelles étiquettes peuvent être dangereuses?

MISE À JOUR: Typo est fixé, c'est ce que vous voyez, c'est ce que vous obtenez. Rien de nouveau 🙂

La meilleure pratique est de ne permettre que certaines choses que vous connaissez ne sont pas dangereuses, et éliminer / échapper tout le reste. Consultez le document de détection et de suppression automatique de code malveillant sur le Web (OWASP AntiSamy) pour une discussion à ce sujet (la bibliothèque est pour Java, mais les principes s'appliquent à toute langue).

Si vous êtes vraiment enclins à l'autoriser, vous devriez utiliser une approche de liste blanche.

La meilleure approche est probablement de ne pas autoriser le HTML et d'utiliser un format simplifié de balisage à la place; Vous pouvez pré-rendre à HTML et stocker celui-ci dans la base de données si la performance est une préoccupation. Eviter ces types de problèmes est l'une des grandes raisons d'utiliser Markdown , Textile , reStructuredText , etc.

REMARQUE : J'ai lié à GitHub-Flavored Markdown (GFM), et non à la Markdown Standard (SM). GFM aborde certains problèmes courants que les utilisateurs finaux ont avec SM.

J'ai examiné la même question récemment avec Perl que la langue côté serveur.

Pendant ce temps, j'ai rencontré HTML Purifier, ce qui peut être ce que vous voulez. Mais évidemment, en PHP et non en Perl, je ne l'ai pas testé.

En outre, dans ma recherche, je suis arrivé à la conclusion que c'est une entreprise très délicate et je considère si possible l'utilisation d'un langage de balisage simplifié comme Markdown, comme l'a suggéré Hank Gay.

Si vous êtes familier avec ASP .NET, exécutez simplement Server.htmlencode () pour convertir des caractères spéciaux tels que <> à "& gt;" "& L t;"

Dans php, vous pouvez utiliser les fonctions htmlspecialchars ().

Une fois que les caractères spéciaux sont encodés, les scripts entre sites peuvent être évités.