From 4358a16e967c963f10ce29e5528c28ff74fbc56c Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Fri, 5 Jun 2020 11:07:15 +0200
Subject: [PATCH] =?UTF-8?q?Sanitiser=20les=20pr=C3=A9f=C3=A9rences=20utili?=
 =?UTF-8?q?sateurs.=20(g0uz)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

On déclare une fonction spip_sanitize_classename en passant.
---
 ecrire/inc/commencer_page.php | 23 ++++++++++-------------
 ecrire/inc/utils.php          | 17 +++++++++++++++++
 ecrire/index.php              |  4 ++--
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/ecrire/inc/commencer_page.php b/ecrire/inc/commencer_page.php
index 8ce47b3c19..cb4897f126 100644
--- a/ecrire/inc/commencer_page.php
+++ b/ecrire/inc/commencer_page.php
@@ -157,16 +157,14 @@ function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubriq
  * @return string Classes CSS (séparées par des espaces)
  */
 function init_body_class() {
-	$GLOBALS['spip_display'] = isset($GLOBALS['visiteur_session']['prefs']['display'])
-		? $GLOBALS['visiteur_session']['prefs']['display']
-		: 2;
-	$spip_display_navigation = isset($GLOBALS['visiteur_session']['prefs']['display_navigation'])
-		? $GLOBALS['visiteur_session']['prefs']['display_navigation']
-		: 'navigation_avec_icones';
-	$spip_display_outils = isset($GLOBALS['visiteur_session']['prefs']['display_outils'])
-		? ($GLOBALS['visiteur_session']['prefs']['display_outils'] ? 'navigation_avec_outils' : 'navigation_sans_outils')
+	$prefs = isset($GLOBALS['visiteur_session']['prefs']) ? $GLOBALS['visiteur_session']['prefs'] : array();
+
+	$GLOBALS['spip_display'] = isset($prefs['display']) ? (int) $prefs['display'] : 2;
+	$spip_display_navigation = isset($prefs['display_navigation']) ? spip_sanitize_classname($prefs['display_navigation']) : 'navigation_avec_icones';
+	$spip_display_outils = isset($prefs['display_outils'])
+		? ($prefs['display_outils'] ? 'navigation_avec_outils' : 'navigation_sans_outils')
 		: 'navigation_avec_outils';
-	$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "etroit";
+	$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? spip_sanitize_classname($_COOKIE['spip_ecran']) : "etroit";
 
 	$display_class = array(
 		0 => 'icones_img_texte'
@@ -176,11 +174,10 @@ function init_body_class() {
 		3 => 'icones_img'
 	);
 
-	$couleur = isset($GLOBALS['visiteur_session']['prefs']['couleur'])
-		? $GLOBALS['visiteur_session']['prefs']['couleur']
-		: 9;
+	$couleur = isset($prefs['couleur']) ? (int) $prefs['couleur'] : 9;
 
-	return $GLOBALS['spip_ecran'] . " couleur_$couleur $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
+	$classes = $GLOBALS['spip_ecran'] . " couleur_$couleur $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']];
+	return spip_sanitize_classname($classes);
 }
 
 
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index ec6c845d4d..a61217fb4b 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -3588,3 +3588,20 @@ if (PHP_VERSION_ID < 50500) {
 
 	}
 }
+
+/**
+ * Nettoie une chaine pour servir comme classes CSS.
+ *
+ * @note
+ *     les classes CSS acceptent théoriquement tous les caractères sauf NUL.
+ *     Ici, on limite (enlève) les caractères autres qu’alphanumérique, espace, - + _ @
+ *
+ * @param string|string[] $classes
+ * @return string|string[]
+ */
+function spip_sanitize_classname($classes) {
+	if (is_array($classes)) {
+		return array_map('spip_sanitize_classname', $classes);
+	}
+	return preg_replace("/[^ 0-9a-z_\-+@]/i", "", $classes);
+}
\ No newline at end of file
diff --git a/ecrire/index.php b/ecrire/index.php
index ddc116c305..4295b5f450 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -146,9 +146,9 @@ elseif (!preg_match(',^[a-z4_][0-9a-z_-]*$,i', $exec)) {
 
 // compatibilite ascendante : obsolete, ne plus utiliser
 $GLOBALS['spip_display'] = isset($GLOBALS['visiteur_session']['prefs']['display'])
-	? $GLOBALS['visiteur_session']['prefs']['display']
+	? (int) $GLOBALS['visiteur_session']['prefs']['display']
 	: 0;
-$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "etroit";
+$GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? preg_replace('/[^a-z0-9]/i', '', $_COOKIE['spip_ecran']) : "etroit";
 
 //  si la langue est specifiee par cookie et ne correspond pas
 // (elle a ete changee dans une autre session, et on retombe sur un vieux cookie)
-- 
GitLab