Boucle DATA : filtrage par LIKE ou REGEXP & utf8
Dans une boucle DATA qui récupère un JSON j'utilise {titre LIKE %(#ENV{recherche_annuaire,_})%}
pour filtrer les résultats en fonction d'un formulaire recherche présent dans la page.
Je remarque que les caractères accentués et les apostrophes posent problème et ne permettent pas d'obtenir les bons résultats dans la boucle, par exemple "récré" ne match par "RÉCRÉ".
J'ai donc regardé du côté des itérateurs et je vois que pour les critère du type LIKE
et ==
on utilise le filtre match
de SPIP cf https://git.spip.net/spip/spip/src/commit/9b90f1b8a15bcd9e1e25fe9a37e5bad516b248b2/ecrire/public/iterateur.php#L329 qui par défaut utilise les modifiers UimsS
dans preg_match
cf https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/filtres.php#L3258
Si je surcharge le filtre match
pour lui appliquer en plus le modifier u
pour l'utf8, donc UuimsS
, le filtrage fonctionne bien pour une recherche comme cité plus haut. Mais je trouve dommage de devoir surcharger ce filtre qui est utilisé à plein d'autres endroits pour obtenir ce résultat.
Pour info, le code des "critères" LIKE et == dans une boucle DATA date d'il y a 11 ans cf https://git-mirror.spip.net/spip/spip/-/commit/198299f3014632dd6be1734b226d151de3606748
Dans #4354 (closed) @marcimat disait :
ah pour PHP c’est simple, il faut le modificateur
u
(pour prce_utf8)
Je me demande donc s'il ne serait pas opportun d'ajouter la prise en charge de l'utf8 pour ces critères dans les boucles DATAS lors de l'appel à filtrer match.
Avec la version patchée du filtre match
, j'ai pu faire fonctionner la recherche d'une chaîne contenant une apostrophe à l'aide d'une étoile sur la balise qui récupère la valeur à rechercher. Mais pour cela il faut passer par un ==
au lieu d'un LIKE
qui va générer une erreur dans ce cas, ce qui donne {titre==#ENV*{recherche_annuaire,.*}}
. J'espère juste que je n'ouvre pas de "faille" en faisant ça, j'ai tenté d'y faire passer une chaîne qui permet de générer une XSS et ça semble safe.