From d10a0f386d6e89bc4aeda8967e2b2a53aca5bd3c Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Sun, 19 Nov 2006 19:48:28 +0000
Subject: [PATCH] "proteger dans le contenu le javascript venant des modeles
 (et uniquement celui la) lorsque l'on est identifie l'echappement utilise
 l'alea tournant de l'auteur connecte, ce qui evite un risque d'injection de
 javascript encode64 dans un article par un auteur malveillant"

---
 ecrire/inc/texte.php | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index 4af04e725e..e0d10a7280 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -386,6 +386,15 @@ function echappe_js($t,$class='') {
 			$t);
 	return $t;
 }
+function protege_js_modeles($t) {
+	if (isset($GLOBALS['auteur_session']['alea_actuel'])){
+		$a = $GLOBALS['auteur_session']['alea_actuel'];
+		if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER))
+			foreach ($r as $regs)
+				$t = str_replace($regs[0],code_echappement($regs[0],'javascript'.$a),$t);
+	}
+	return $t;
+}
 
 // Securite : empecher l'execution de code PHP, en le transformant en joli code
 // http://doc.spip.org/@interdire_scripts
@@ -1079,6 +1088,7 @@ function traiter_modeles($texte, $doublons=false, $echap='') {
 
 				// le remplacer dans le texte
 				if ($modele !== false) {
+					$modele = protege_js_modeles($modele);
 					$rempl = code_echappement($modele, $echap);
 					$texte = substr($texte, 0, $a)
 						. $rempl
@@ -1512,6 +1522,10 @@ function propre($letexte) {
 	if (!_DIR_RESTREINT)
 		$letexte = interdire_scripts($letexte);
 
+	// Reinserer le javascript de confiance (venant des modeles)
+	if (isset($GLOBALS['auteur_session']['alea_actuel']))
+		$letexte = echappe_retour($letexte,"javascript".$GLOBALS['auteur_session']['alea_actuel']);
+
 	return $letexte;
 }
 
-- 
GitLab