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