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