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('&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