From e9e104fc2d518f03b91f9c4ea140daa23c769780 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Sat, 10 Oct 2015 08:29:41 +0000 Subject: [PATCH] Fix #3371 : dans la fonction typo, si un flag espace_prive=1 est present dans le env, on echappe tout html suspect, ie qui ne passe pas a travers safehtml sans censure. Pour limiter l'impact perfo on conditionne l'echappement a la presence des caracteres < et = dans le texte, c'est a dire une balise avec un attribut, ce qui ne traitera donc quasiment aucun contenu par defaut, sauf quelques rares <span lang='en'> ou autre curiosite de ce type --- ecrire/inc/texte.php | 6 ++++++ ecrire/inc/texte_mini.php | 24 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index 8e3f650e1c..506a9b21e9 100644 --- a/ecrire/inc/texte.php +++ b/ecrire/inc/texte.php @@ -237,6 +237,12 @@ function typo($letexte, $echapper=true, $connect=null, $env=array()) { if ($interdire_script) $letexte = interdire_scripts($letexte); + // Dans l'espace prive on se mefie de tout contenu dangereux + // https://core.spip.net/issues/3371 + if (isset($env['espace_prive']) AND $env['espace_prive']){ + $letexte = echapper_html_suspect($letexte); + } + return $letexte; } diff --git a/ecrire/inc/texte_mini.php b/ecrire/inc/texte_mini.php index 91d507db68..71974e7046 100644 --- a/ecrire/inc/texte_mini.php +++ b/ecrire/inc/texte_mini.php @@ -392,13 +392,35 @@ function echapper_faux_tags($letexte){ $letexte = ""; while (count($textMatches)) { // un texte a echapper - $letexte .= str_replace(array("<"),array('<'),array_shift($textMatches)); + $letexte .= str_replace("<",'<',array_shift($textMatches)); // un tag html qui a servit a faite le split $letexte .= array_shift($textMatches); } return $letexte; } +/** + * Si le html contenu dans un texte ne passe pas sans transformation a travers safehtml + * on l'echappe + * si safehtml ne renvoie pas la meme chose on echappe les < en < pour montrer le contenu brut + * + * @param string $texte + * @return string + */ +function echapper_html_suspect($texte){ + if (strpos($texte,'<')===false OR strpos($texte,'=')===false) + return $texte; + + // on teste sur strlen car safehtml supprime le contenu dangereux + // mais il peut aussi changer des ' en " sur les attributs html, + // donc un test d'egalite est trop strict + if (strlen(safehtml($texte))!==strlen($texte)){ + $texte = str_replace("<","<",$texte); + } + + return $texte; +} + /** * Sécurise un texte HTML -- GitLab