WEB-d Développement Web

PHP, SQL, HTML5, CSS3, Javascript, Mootools, Référencement, SEO, CMS, e-commerce, Apache, Linux, Ubuntu, ...

HTMLPurifier, les tableaux multidimensionnels (nested arrays) et les formulaires

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;
}
 

Articles similaires