Une URL avec le signe égal est suspecte en auto lien avec $filtrer_javascript=-1

Bonjour,
Sur un site avec $filtrer_javascript=-1,

Un article dont le texte contient (en auto lien) :
http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2013:020:0033:0043:FR:PDF
s’affiche en faisant précéder le lien d’une icône en triangle et de la balise html (échappée) : :warning: http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2013:020:0033:0043:FR:PDF

Si j’enlève le signe égal (=) dans le texte de l’article :
http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uriOJ:L:2013:020:0033:0043:FR:PDF
alors le lien est affiché correctement.

Ceci provient de ecrire\inc\texte_mini.php, function echapper_html_suspect
if (strpos($texte, ‹ < ›) === false
or strpos($texte, ‹ = ›) === false) {
return $texte;
} … sinon comparaison de la longueur du texte avec celle obtenue via safehtml

Si l’URL contient le signe égal, elle est donc considérée comme suspecte.

Le problème c’est que :

  • c’est un cas d’URL répandu.
  • c’est un cas largement utilisé dans les articles de certains sites SPIP (en auto lien).
  • d’anciennes versions de SPIP toléraient les URL avec le signe égal (en auto lien).

Les utilisateurs considèrent cela comme une régression et ne souhaitent pas devoir transformer à la main ces auto liens en lien avec la syntaxe de SPIP […->…].
Aussi, ils souhaitent que ces URL ne soient pas considérées comme suspectes.

Cordialement
Equipement

C’est un peu plus compliqué que ça : #4926 - les autoliens sont mal échappés en mode parano - spip - SPIP on GIT

Dans ecrire\inc\texte_mini.php, la fonction echapper_html_suspect compare la longueur du texte avec celle obtenue via safehtml.

Dans l’exemple précité, le texte qui est passé à la fonction echapper_html_suspect est (sans échappement des balises html) :
<html>http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2013:020:0033:0043:FR:PDF</html>.

La fonction safehtml supprime les balises <html> et </html> (sans échappement), ce qui réduit la longueur du texte.

Aussi, une piste consiste à remplacer (sans échappement des balises html) :
if (strlen(safehtml($texte)) !== strlen($texte)) {
par
if (strlen(safehtml($texte)) !== strlen(str_replace(array(’<html>’,’</html>’),’’,$texte))) {

Cordialement
Equipement