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('&lt;'),array_shift($textMatches));
+  	$letexte .= str_replace("<",'&lt;',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 &lt; 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("<","&lt;",$texte);
+	}
+
+	return $texte;
+}
+
 
 /**
  * Sécurise un texte HTML 
-- 
GitLab