Problèmes récurrents d'affichage avec 4.2 dev (HTMLpurifier ?)

Hello,

En testant mes plugins en PHP 8.1 et spip 4.2 dev je m’aperçois que j’ai des problèmes d’affichage qui apparaissent et qui étaient absents avant.
Les deux cas que j’ai eu plusieurs fois :

  • un affichage multi dans une boucle DATA qui ne fonctionnent plus avec le extraire_multi
  • des liens échappés avec un triangle de danger avant pour dire que le texte a été échappé.

Pour le cas 1, j’ai ajouté une étoile à mon #VALEUR pour éviter le traitement comme me l’a conseillé @marcimat (surement le safehtml).
Pour le cas 2, je n’ai pas trouvé de solution pour l’instant.

A priori ça semble venir de HTMLPurifier (au moins le cas 1) et si c’est bien ça c’est un peu problématique comme step.
Faut-il passer partout pour vérifier ?
La modification que j’ai faite est-elle retro-compatible ?

Vos avis sont les bienvenus.

Pour le cas 2, ce qui nous intéresse c’est le texte concerné pour reproduire. De deux choses l’une : ou ce sont des faux positifs et il faut qu’on trouve comment corriger, si c’est possible, ou c’est justifié d’avoir une alerte sur ces cas là parce qu’ils ressemblent à des xss, et alors il n’y a pas de solution

À noter que pour les multi @marcimat a proposé une solution à discuter ici https://git.spip.net/spip/safehtml/pulls/4785

Alors le texte affiché est le suivant :

<mark>⚠️</mark><a href="http://www.itis.gov" rel="noreferrer">ITIS</a> (informations taxonomiques de base). Voir aussi la page du taxon <mark>⚠️</mark><a class="nom_scientifique" href="http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=714857" rel="noreferrer">Bombus alpinus</a>.
>Wikipedia (descriptif rapide). Voir aussi la page du taxon <mark>⚠️</mark><a class="nom_scientifique" href="https://fr.wikipedia.org/wiki/Bombus%20alpinus" rel="noreferrer">Bombus alpinus</a>.
><mark>⚠️</mark><a href="https://www.iucn.org/" rel="noreferrer">IUCN</a> (etat de conservation, détails de l'évaluation iucn). Voir aussi la page du taxon sur le site <mark>⚠️</mark><a href="https://www.iucnredlist.org/" rel="noreferrer">IUCN Red List</a>

AH je pense que rel=« noreferrer » n’a pas été mis dans la liste des rel possible ici
https://git.spip.net/spip/safehtml/src/branch/master/inc/safehtml.php#L47

Je pense que si tu ajoutes ce rel là ça doit passer du coup

Seriously, ya une liste en dur de 4 rel possible ?

$config->set('Attr.AllowedRel', 'nofollow,print,external,bookmark');

Alors que le RFC + IANA des liens internet et de l’attribut « rel » en liste… des DIZAINES officielles et légitimes :
https://datatracker.ietf.org/doc/rfc8288/
et la liste IANA :
https://www.iana.org/assignments/link-relations/link-relations.xhtml

Soit faut enlever ça (du moment qu’il n’y a pas d’injection dangereuse, on s’en fout même que la valeur est pas officielle), soit faudrait mettre la vraie liste complète

Ah ben c’est la joie des purifier. C’est bien beau d’avoir râlé sur safehtml en demandant à cors et à cris le passage à HtmlPurifier sans même y avoir jeté un coup d’oeil pour finalement s’exclafer au scandale.

Be my guest, c’est du code libre

Vu ça aussi dans la liste des plugins (plugin Paniers + langue EN) :

⚠️ &lt;span lang='fr'&gt;Créer des sélections d’objets ayant un prix&lt;/span&gt;

Screenshot 2022-09-05 at 21-36-52 SPIP Main Manage plugins

Un ticket ?

Euh tu mélanges toutes les personnes…

  1. j’ai jamais réclamé à cor et à cri de passer à htmlpurifier, moi j’ai juste dit et confirmé que l’ancien pétait vraiment complètement le html5 (qui a des années et des années maintenant) et que donc ça pétait les sites pourtant légitimes et que ça serait bien une lib plus récente oui, quelle qu’elle soit
  2. comme si on pouvait lire des dizaines de milliers de ligne de code pour voir comment ça marche par avance…
  3. mais la liste en dur en question… est dans notre code à nous, si je ne m’abuse, donc c’est un choix de notre part ce morceau avec seulement 4, peu importe comment marche htmlpurifier

Par contre c’est dingue et mal conçu qu’ils ne prévoient aucune syntaxe pour dire d’un coup « TOUT autorisé » ! Quand on met rien la doc dit "By default, this is empty, meaning that no document relationships are allowed. " Et on peut pas mettre genre => '*' par exemple… (comme l’api liens spip)

Du coup le seul moyen c’est de faire un array avec la liste complète du IANA à priori…

Voici la liste reformatée en array déjà :

['about', 'acl', 'alternate', 'amphtml', 'appendix', 'apple-touch-icon', 'apple-touch-startup-image', 'archives', 'author', 'blocked-by', 'bookmark', 'canonical', 'chapter', 'cite-as', 'collection', 'contents', 'convertedFrom', 'copyright', 'create-form', 'current', 'describedby', 'describes', 'disclosure', 'dns-prefetch', 'duplicate', 'edit', 'edit-form', 'edit-media', 'enclosure', 'external', 'first', 'glossary', 'help', 'hosts', 'hub', 'icon', 'index', 'intervalAfter', 'intervalBefore', 'intervalContains', 'intervalDisjoint', 'intervalDuring', 'intervalEquals', 'intervalFinishedBy', 'intervalFinishes', 'intervalIn', 'intervalMeets', 'intervalMetBy', 'intervalOverlappedBy', 'intervalOverlaps', 'intervalStartedBy', 'intervalStarts', 'item', 'last', 'latest-version', 'license', 'linkset', 'lrdd', 'manifest', 'mask-icon', 'media-feed', 'memento', 'micropub', 'modulepreload', 'monitor', 'monitor-group', 'next', 'next-archive', 'nofollow', 'noopener', 'noreferrer', 'opener', 'openid2',.'local_id', 'openid2',.'provider', 'original', 'P3Pv1', 'payment', 'pingback', 'preconnect', 'predecessor-version', 'prefetch', 'preload', 'prerender', 'prev', 'preview', 'previous', 'prev-archive', 'privacy-policy', 'profile', 'publication', 'related', 'restconf', 'replies', 'ruleinput', 'search', 'section', 'self', 'service', 'service-desc', 'service-doc', 'service-meta', 'sponsored', 'start', 'status', 'stylesheet', 'subsection', 'successor-version', 'sunset', 'tag', 'terms-of-service', 'timegate', 'timemap', 'type', 'ugc', 'up', 'version-history', 'via', 'webmention', 'working-copy', 'working-copy-of',]

Bon, j’ai patché la config en rajoutant le noreferrer dans la liste autorisée et j’ai deux corrections sur les 3 liens, à savoir :

 ITIS (informations taxonomiques de base). Voir aussi la page du taxon ⚠️<a class="nom_scientifique" href="http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=183813" rel="noreferrer">Acinonyx jubatus</a>.
Wikipedia (descriptif rapide). Voir aussi la page du taxon Acinonyx jubatus.
IUCN (etat de conservation, détails de l'évaluation iucn). Voir aussi la page du taxon sur le site IUCN Red List

Hello,

Des news sur ce sujet ?

Nope, personne n’a créé de ticket, ça ne risque pas d’avancer :slight_smile:

Ben en fait j’attendais que l’on s’exprime sur le fait qu’il reste encore un problème comme je l’explique même en rajoutant le ‹ noreferrer › dans les attributs autorisés.

Tu peux fournir le texte source minimum qui te produit cet affichage avec une erreur ? que l’on ajoute un test unitaire dessus avant de corriger le(s) bug(s) ?

J’ai donc fait un ticket https://git.spip.net/spip/spip/issues/5334 et deux PR avec la matière que j’avais dans cette discussion. Compléter le ticket si il y a d’autres cas

Alors la PR spip n’a pas d’incidence sur le cas d’erreur résiduel de mon exemple.
Quand je suis le fil en debug, c’est l’appel à la fonction _T qui renvoie la balise <mark> dans le texte.

L’appel est le suivant :

_T(
    '@url_site@ (informations taxonomiques de base). Voir aussi la page du taxon @url_taxon@.',
    array(
        'url_site' => '<a href="http://www.itis.gov" rel="noreferrer">ITIS</a>',
        'url_taxon' =>  '<a class="nom_scientifique" href="http://www.itis.gov/servlet/SingleRpt/SingleRpt?search_topic=TSN&search_value=183813" rel="noreferrer">Acinonyx jubatus</a>'
    )
);