HTMLPurifier, les tableaux multidimensionnels (nested arrays) et les formulaires
Posté le Monday 2 April 2012 | Catégories : PHP
HTMLPurifier permet d'éviter les attaques Cross Site Scripting (XSS) en filtrant le texte rédigé par un utilisateur (par exemple dans un formulaire servant à envoyer un commentaire). HTMLPurifier possède une méthode filterArray qui permet, comme son nom l'indiquer, de filtrer directement un tableau (array) contenant du texte:
$texte[] = "Ligne 1";
$texte[] = "Ligne 2";
require_once 'HTMLPurifier.auto.php';
$purifier = new HTMLPurifier();
$texte_filtre = $purifier->purifyArray($texte);
Attention cependant que cette fonction n'est pas récursive, et ne fonctionne donc pas avec les tableaux multidimensionnels (nested arrays)! L'exemple ci-dessous produit un résultat vide:
$texte[] = array("Ligne 1a", "Ligne 1b");
$texte_filtre = $purifier->purifyArray($texte);
Ceci peut notamment poser problème avec les formulaires:
<form method="post">
<input type="checkbox" name="categories[]" value="PHP">PHP</input>
<input type="checkbox" name="categories[]" value="(x)HTML">(x)HTML</input>
<input type="checkbox" name="categories[]" value="Javascript">Javascript</input>
</ form>
$post_filtre = $purifier->purifyArray($_POST);
var_dump($post_filtre["categories"];
// Sera toujours vide, même si certaines catégories sont cochées
La solution est pourtant relativement simple, il suffit de modifier la méthode purifyArray dans le fichier /usr/share/php/HTMLPurifier.php (vers la ligne 200) pour qu'elle ressemble à ceci:
foreach ($array_of_html as $key => $html) {
if (is_array($html)) {
$array_of_html[$key] = $this->purifyArray($html, $config);
} else {
$array_of_html[$key] = $this->purify($html, $config);
}
$context_array[$key] = $this->context;
}