PROJET AUTOBLOG


Shaarli - Les discussions de Shaarli

Archivé

Site original : Shaarli - Les discussions de Shaarli

⇐ retour index

Shaarli : Add link sans bookmarklet = problème d'encodage des titres

mardi 4 août 2015 à 11:19
GuiGui's Show - Liens
J'ai remarqué deux fonctionnements différents pour l'ajout d'un lien dans shaarli selon que l'on utilise ou non le bookmarklet :
       * Ajout d'un lien https : avec le bookmarklet, le titre (<title></title>) de la page que l'on veut shaarlier est récupéré via JS et on l'a donc automatiquement ; sans le bookmarklet, le titre est vide.


       * Encodage des caractères accentués et spéciaux dans le titre d'une page que l'on veut shaarlier : de plus en plus de page ont des entités HTML dans leur balise <title></title>. Exemples :
               * https://labs.ripe.net/Members/philip_homburg/ntp-measurements-with-ripe-atlas : <title>NTP Measurements with RIPE Atlas &mdash; RIPE Labs</title>

               * http://lexpansion.lexpress.fr/high-tech/louis-pouzin-internet-est-bati-sur-un-marecage_1650342.html : <title>Louis Pouzin: "Internet est b&acirc;ti sur un mar&eacute;cage" - L'Express L'Expansion</title>

               Avec le bookmarket, le title est récupéré "tout prêt" (sans entités HTML), en JS, avec document.title, puis il est passé à la fonction encodeURIComponent() pour encodage pour passage GET et réutilisé tel quel côté PHP.

               Sans le bookmarklet, le titre est récupéré grâce à un file_get_contents() et une regex puis il est éventuellement converti en fonction du charset indiqué dans le header HTML charset. Dans ce cas là, les entités HTML sont toujours là et il faut les remplacer à la main par le caractère correspondant.


Voici mes propositions pour améliorer ces deux points :
       * Ajout d'un lien https :
             La ligne 1569 change de :
                 if (empty($title) && parse_url($url,PHP_URL_SCHEME)=='http')
             Pour :
                 if (empty($title) && (parse_url($url,PHP_URL_SCHEME)=='http' || parse_url($url,PHP_URL_SCHEME)=='https'))

             Il n'y a pas plus de travail à effectuer, file_get_contents gère https si l'extension openssl est présente et activée, ce qui est le cas par défaut sur les systèmes GNU/Linux.


       * Encodage des caractères accentués et spéciaux : on ajoute ce qui suit à la ligne 1595 :
               $title = html_entity_decode($title);


       Vu qu'avec le bookmarklet, c'est le navigateur qui sanitize le title avant récupération par JS, je ne sais pas si l'ajout de ce bout de code n'introduit pas une faille de sécurité. Au pire, je vois deux types de
menace :
               * attaque de type CSRF pour "forcer" un admin à publier un shaarli pointant vers une page forgée (XSS). Shaarli est déjà blindé contre ce type d'attaques ;

               * l'admin publie volontairement un shaarli d'une page dont le title est malveillant...
(Permalink)