Assainir une source HTML avec HTMLPurifier

Pour valider du texte riche (balises html) on m’a recommandé la bibliothèque HTMLPurifier. Première visite sur le site officiel et les promesses semblaient au rendez-vous. La nécessité d’avoir PHP5 n’était pas un souci car facilement changeable auprès de l’hébergeur via un .htaccess.

Ce fut alors que j’ai découvert qu’il y a très peu d’exemples pour s’inspirer et la documentation est assez lourde. J’ai donc passé une journée à essayer de comprendre comment cela fonctionnait avant d’aboutir au code suivant:

     require_once 'htmlpurifier/HTMLPurifier.auto.php';
 
    $config = HTMLPurifier_Config::createDefault();
    $config->set('Core.Encoding', 'ISO-8859-1');
    $config->set('Cache.DefinitionImpl', null); // TODO: remove this later!
    $config->set('HTML.Allowed', 'a[href],i,b,img[src],font[style|size],ol,ul,li,br');
 
    $purifier = new HTMLPurifier($config);

Le require_once au début permet un chargement automatique de HTMLPurifier. Ensuite, on récupère une instance pour effectuer quelques set pour la configuration.

Dans le détail, la propriété HTML.Allowed permet de définir toutes les balises et attributs que l’on souhaite autoriser. Par exemple, ici on a autorisé la balise font avec les attributs style et size. Les deux autres propriétés sont à utiliser dans des cas précis. Le Cache.DefinitionImpl en null est principalement destiné aux développeurs pour désactiver le cache. Le Core.Encoding, lui, permet de changer l’encodage par défaut qui est normalement en UTF-8. J’ai utilisé celui-ci sur un site utilisant l’ISO pour éviter que les accents soient filtrés.

Voici le code pour effectuer un filtrage à proprement dire*:

     $purifier = new HTMLPurifier($config);
    $variable = $purifier->purify( $_POST['question'] );

On lance une instance HTMLPurifier en passant la configuration créée en paramètre. Ensuite appelle tout simplement une méthode sur une variable ou une entrée. A la sortie, toutes les balises quelle qu’elles soient qui ne sont pas reprises dans la whitelist ont été enlevées.

Pour l’utilisation que je souhaitais en faire c’est donc réussi. Pour ceux qui veulent explorer les possibilités de la bibliothèque ce n’est que le début et vous trouverez d’autres options intéressantes comme le Tidy qui permet de reconstituer des balises manquantes.

Site officiel: http://htmlpurifier.org/

*Prenez les précautions habituelles comme l’utilisation de mysql_real_escape_string avant d’entrer l’information dans une base de données. Merci à Jérôme pour cette précision.

– James Poulson.

3 réflexions au sujet de « Assainir une source HTML avec HTMLPurifier »

  1. Merci pour les commentaires Jérôme et nighty. Les réactions sont le bienvenu. Oui, là j’avoue qu’il y a erreur. J’ai repris le PHP il y a quelques semaines et j’en suis encore à me référer à des tutoriaux. J’ai lu quelque chose à propos des PDO et ce serait bien de voir si on peut constituer une couche de données.

  2. J’allais également commenter la phrase de conclusion, mais Jérôme ci-dessus m’a pris de cours. J’irais même plus loin en disant que le mieux reste encore d’utiliser PDO et des requêtes paramétrées, si c’est du domaine du possible bien évidemment.

    En tout cas merci pour cet article, je ne connaissais pas HTML Purifier jusqu’ici.

Les commentaires sont fermés.