diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index 8e3f650e1cf08e9993c0565994ca3dcc2e1572e0..506a9b21e97ed947a43ba4aff113fa475646e2c8 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 91d507db687dcd6d42f332921363ef658730a412..71974e7046daff2e98efe66b8c95d58e5c63445e 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