2010-06-22 6 views
3

Dans de nombreux sites de plusieurs de mes sites, les utilisateurs sont autorisés à entrer du texte formaté en WYSIWYG ou en texte brut avec des balises. Naturellement, une telle entrée est nettoyée pour les menaces de sécurité, mais elle n'est pas dépouillée des balises et n'est pas entièrement codée en entité. Quelque chose comme <p>hello world</p> finit par revenir à l'utilisateur final comme <p>hello world</p>.Forcer la fermeture de balises en texte dynamique

La plupart des WYSIWYG sont assez intelligents pour nettoyer le XML avant de retourner le contenu au formulaire, mais les requêtes POST manuelles, les zones de texte non-WYSIWYG et les utilisateurs non-JS ne seront pas soumis à cette attraction. . Il n'y a donc rien pour empêcher un utilisateur d'entrer <a href="/">, transformant le reste de la page en un lien.

Quelle est la meilleure façon de traiter cela?

Répondre

2

Quel que soit l'utilisateur fournit, l'analyser à l'aide d'un analyseur HTML. Désinfectez-le alors qu'il s'agit d'un DOM, puis sérialisez le DOM en HTML en prenant le contenu de l'élément body (l'analyseur en créera un si nécessaire) en tant que chaîne renvoyée à l'utilisateur final. Tous les éléments nécessaires auront des étiquettes de fermeture en place.

+0

Cela semble raisonnable, même si je préfère une approche qui l'assainit une seule fois et met en cache le code HTML. De toute façon, pouvez-vous recommander un outil qui fait cela pour PHP et/ou Rails? –

+0

Pas vraiment. Ni PHP ni Rails ne sont ma spécialité. Il y a beaucoup de questions sur les analyseurs syntaxiques HTML pour différentes langues, alors je vous suggère de faire une recherche ou de poser une nouvelle question. Bien que la désinfection HTML soit plus facile et plus fiable sur un DOM, si vous en avez une tierce avec une bonne réputation, il n'est pas nécessaire de basculer. Je voulais juste souligner à quel point il est bon d'assainir votre HTML. Une fois que le texte de l'utilisateur a été soumis à un cycle d'analyse/sérialisation, vous pouvez mettre en cache le résultat. – Alohci

0

Si l'utilisateur est sur le point d'envoyer du texte avec des balises non fermées, il serait judicieux de donner un message d'avertissement.

Si l'utilisateur veut afficher une seule étiquette <br>, il doit être fermé comme <br />. Ou devrait être fermé avec l'étiquette de fin séparément </br>.

Questions connexes