En lisant récemment un tutoriel sur les applications web MVC, j'ai découvert le composant HTML Purifier. Il s'agit d'un filtre HTML open source qu'on peut utiliser dans nos applications, qui permet de contrer les faiblesses de la fonction PHP strip_tags() en proposant un filtre avancé hautement configurable. Si vous avez un site web qui autorise les visiteurs à entrer du contenu à l'aide d'un textarea, d'un RTE, ou sur un forum, il est extrêmement recommandé d'utiliser un filtre de ce type.
En comparaison avec HTML Tidy qui accepte n'importe quel markup HTML valide, incluant les balises SCRIPT, HTML Purifier peut non seulement épurer le code et le rendre conforme aux standards, mais aussi retirer tout code malicieux de cross-site scripting (XSS).
Voici un exemple fonctionnel de configuration minimale. Les éléments sont regroupés en différents ensembles : Core, CSS, HTML, AutoFormat, Output, Cache, etc. Voyez la liste complète des propriétés configurables pour HTML Purifier.
require_once('htmlpurifier-3.3.0/library/HTMLPurifier.auto.php');Quelques notes importantes
// 1. définir la configuration
$config = HTMLPurifier_Config::createDefault();
// choisir l'encodage de la page : UTF-8, ISO-8859-1
$config->set('Core', 'Encoding', 'UTF-8');
$config->set('HTML', 'Doctype', 'XHTML 1.0 Strict');
$config->set('HTML', 'TidyLevel', 'heavy');
// les balises autorisées
$config->set('HTML', 'Allowed', 'a[href],strong,i,b,em,p,br');
// ou encore celles interdites
$config->set('HTML', 'ForbiddenElements', 'iframe');
// 2. utilisation
$html = 'html à nettoyer ici';
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($html);
echo $clean_html;
- Le DocType sera utilisé pour générer du HTML valide correspondant. Par exemple, <br> sera traduit par <br /> en XHTML Strict
- En initialisant TidyLevel à la valeur "heavy", le filtre transformera tous les éléments et attributs dépréciés à des normes conformes équivalentes.
- Dans votre configuration, si magic_quotes est à ON, il y aura des problèmes avec l'interprétation des guillemets simples et doubles dans les attributs HTML (exemple: a href="http://www.ebay.ca/"). Il faudra donc le désactiver temporairement, seulement si vous autorisez l'entrée de balises avec des attributs.
- À la ligne des balises autorisées, j'ai inscrit a[href]. Certaines personnes se demandent comment autoriser aussi l'attribut target, par exemple target="_blank". Comme j'ai initialisé l'outil au DocType XHTML 1.0 Strict, il n'est pas autorisé. Par contre, on pourra le spécifier en modifiant la configuration pour la suivante :
$config->set('Attr', 'AllowedFrameTargets', array('_blank') );
$config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional'); - Il est conseillé de mettre à jour le composant régulièrement pour bénéficier des derniers ajouts en matière de sécurité