Le problème avec htmlspecialchars et Zend_Filter_HtmlEntities est que si vous essayez de dépouiller toutes les balises HTML (comme « a » et « img », etc.), puis au lieu de les dépouiller, vous finir avec ce balisage dans votre sortie.
Prenez des commentaires sur un blog par exemple. Si vous utilisez htmlspecialchars ou Zend_Filter_HtmlEntities, dans un commentaire où quelqu'un essaie d'utiliser html pour entrer un lien, vous obtenez ce balisage lorsque vous affichez le commentaire. Mais si vous utilisez strip_tags ou Zend_Filter_StripTags, vous finissez par altérer le commentaire, car ni l'un ni l'autre n'est assez intelligent pour réaliser que '< 3' n'est pas un tag, et supprime tout de '< 3' jusqu'à la fin du commentaire (ou il trouve '>').
Ce serait bien si Zend avait quelque chose comme HTMLPurifier, où il vérifie et valide l'entrée avant de supprimer les balises. Cela signifie que des choses comme '< 3' se retrouvent seules, où des choses comme 'Awesome Site' deviennent 'Awesome Site'.
C'est un problème que j'essaie de contourner, et pour l'instant il semble que je vais finir par écrire ma propre classe Zend_Filter qui est fondamentalement une enveloppe pour HTMLPurifier.
Avez-vous envisagé de ne pas filtrer, mais simplement de convertir des caractères potentiellement dangereux en entités HTML à la place (htmlspecialchars() en PHP)? –
strip_tags() (ou son wrapper ZF) est plus adapté aux utilisations comme obtenir du contenu en texte brut à partir d'un morceau de HTML déjà-aseptisé. Pour ce que vous faites (parsing HTML sensible au contexte) un effort un peu plus substantiel est nécessaire. – flussence