Bug sous PHP 5.4 car le charset n'est pas passé à htmlspecialchars (site en iso-8859-1)
Bonjour,
J'ai effectué le test suivant sur un site en iso-8859-1 sous PHP 5.4.22 avec les 4 versions de SPIP suivantes : 3.0.14, 3.0.13, 2.1.24, 2.1.23. J'ai créé un article dont le texte contient uniquement : l'Évasion (avec la majuscule accentuée). Le texte "l'Évasion" s'affiche dans exec=article&id_article=... mais ensuite, il ne s'affiche plus dans exec=article_edit&id_article=...
Ce bug provient d'une évolution de la fonction htmlspecialchars en PHP 5.4 (cf. http://php.net/htmlspecialchars) : "Encodage à utiliser lors de la conversion. Si omis, la valeur par défaut de cet argument sera ISO-8859-1 dans les versions antérieures à PHP 5.4.0, et UTF-8 à partir de la version PHP 5.4.0."
Pour résoudre le problème sous SPIP 3.0.14, une solution consiste à remplacer dans la fonction protege_champ de ecrire/balise/formulaire_.php :
$texte = htmlspecialchars($texte,ENT_QUOTES);
par :
$texte = htmlspecialchars($texte,ENT_QUOTES,$GLOBALS['meta']['charset']);
Pour résoudre le problème sous SPIP 2.1.24, une solution consiste à remplacer dans la fonction entites_html de ecrire/inc/filtres.php :
$texte = htmlspecialchars(echappe_retour(echappe_html($texte,'',true),'','proteger_amp'));
par :
$texte = htmlspecialchars(echappe_retour(echappe_html($texte,'',true),'','proteger_amp'), ENT_QUOTES,$GLOBALS['meta']['charset']);
Remarques :
- cette évolution de htmlspecialchars concerne également la fonction htmlentities de PHP.
- il serait souhaitable de vérifier toutes les utilisations de ces 2 fonctions de PHP dans SPIP.
Cordialement Equipement