From 3949fddca2aa9b34ac69a3d7fe9c21efdee9c0f5 Mon Sep 17 00:00:00 2001 From: b_b <bruno@eliaz.fr> Date: Fri, 3 May 2024 11:13:36 +0200 Subject: [PATCH] fix: supprimer le DOCTYPE et les commentaires des SVG dans le filtre `balise_svg` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit en introduisant une fonction `svg_nettoyer()` qui pourra aussi être utilisée dans le compresseur Fix: #5911 --- ecrire/inc/filtres.php | 4 ++-- ecrire/inc/svg.php | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index 32cecd9efe..19ee5d40dc 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -3631,8 +3631,8 @@ function filtre_balise_svg_dist($img, $alt = '', $class = null, $size = null) { $balise_svg = $match[0]; $balise_svg_source = $balise_svg; - // entete XML à supprimer - $svg = preg_replace(',^\s*<\?xml[^>]*\?>,', '', $svg); + include_spip('inc/svg'); + $svg = svg_nettoyer($svg); // IE est toujours mon ami $balise_svg = inserer_attribut($balise_svg, 'focusable', 'false'); diff --git a/ecrire/inc/svg.php b/ecrire/inc/svg.php index 593f74fc2e..b53f1e79b3 100644 --- a/ecrire/inc/svg.php +++ b/ecrire/inc/svg.php @@ -114,6 +114,30 @@ function svg_lire_attributs($img) { return false; } +/** + * Nettoyer le code d'une balise <svg> pour en retirer le marqueur utf8-bom, l'entête xml et les commentaires + * @param string $img + * @return string + */ +function svg_nettoyer($svg) { + + // Supprime le marqueur utf8-bom du contenu s'il est présent + if (str_starts_with($svg, "\xEF\xBB\xBF")) { + $svg = substr($svg, 3); + } + // Supprimer l'entete xml si besoin + if ((($pos = strpos($svg, '<svg')) !== 0) && $pos) { + $svg = substr($svg, $pos); + } + if (!str_contains($svg, 'http://www.w3.org/2000/svg')) { + $svg = str_replace('<svg', '<svg xmlns="http://www.w3.org/2000/svg"', $svg); + } + // Supprimer les commentaires + $svg = preg_replace(',<!--.*-->,Us', '', $svg); + + return $svg; +} + /** * Convertir l'attribut widht/height d'un SVG en pixels * (approximatif eventuellement, du moment qu'on respecte le ratio) -- GitLab