From 1b982e27af138b534c4858b502cc066ec94aa1df Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sat, 1 Oct 2005 07:31:07 +0000
Subject: [PATCH] verification generale des header() pour eviter toute
 tentative de detournement des entetes (suggere par Cyrille Barthelemy)

---
 ecrire/inc_aide_index.php |  4 ++--
 ecrire/inc_documents.php3 |  3 ++-
 ecrire/inc_version.php3   | 11 +++++++++--
 ecrire/install.php3       |  4 ++--
 ecrire/unpack.php3        |  6 +++---
 ecrire/upgrade.php3       |  6 ++++--
 inc-calcul.php3           |  2 +-
 inc-urls-propres.php3     |  3 +--
 spip_background.php3      |  3 +--
 spip_cookie.php3          |  2 +-
 spip_login.php3           |  7 +++----
 11 files changed, 29 insertions(+), 22 deletions(-)

diff --git a/ecrire/inc_aide_index.php b/ecrire/inc_aide_index.php
index e644e4d421..ef5ba2e07a 100644
--- a/ecrire/inc_aide_index.php
+++ b/ecrire/inc_aide_index.php
@@ -252,7 +252,7 @@ function help_img($regs) {
 			echo $contenu;
 			ecrire_fichier (_DIR_CACHE . 'aide-'.$cache, $contenu);
 		} else
-			header ("Location: $help_server/$rep/$lang/$file");
+			redirige_par_entete("$help_server/$rep/$lang/$file");
 	}
 	exit;
 }
@@ -475,7 +475,7 @@ else {
 	if (!$html) {
 		// Renvoyer sur l'aide en ligne du serveur externe
 		if ($help_server)
-			@Header("Location: $help_server/?lang=$spip_lang");
+			redirige_par_entete("$help_server/?lang=$spip_lang");
 		// Sinon message d'erreur
 		else {
 			erreur_aide_indisponible();
diff --git a/ecrire/inc_documents.php3 b/ecrire/inc_documents.php3
index 62e83208ed..6c388c2f3a 100644
--- a/ecrire/inc_documents.php3
+++ b/ecrire/inc_documents.php3
@@ -432,7 +432,8 @@ function afficher_formulaire_taille($document, $type_inclus='AUTO') {
 			$type_inclus = $type['inclus'];
 
 	if (($type_inclus == "embed"  #meme pour le MP3 : "l x h pixels"? 
-	OR $type_inclus == "image")) {
+	OR $type_inclus == "image")
+	AND $document['largeur']*$document['hauteur']) {
 		echo "<br /><b>"._T('entree_dimensions')."</b><br />\n";
 		echo "<input type='text' name='largeur_document' class='fondl' style='font-size:9px;' value=\"".$document['largeur']."\" size='5'>";
 		echo " &#215; <input type='text' name='hauteur_document' class='fondl' style='font-size:9px;' value=\"".$document['hauteur']."\" size='5'> "._T('info_pixels');
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index c02e005f52..e64d272012 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -583,7 +583,7 @@ function spip_query($query) {
 	// moins bien les erreurs timeout sur SQL), on ne force donc pas l'upgrade
 	if ($GLOBALS['spip_connect_version'] < 0.1) {
 		if (!_DIR_RESTREINT) {$GLOBALS['db_ok'] = false; return;}
-		@Header("Location: upgrade.php3?reinstall=oui");
+		redirige_par_entete("upgrade.php3?reinstall=oui");
 		exit;
 	}
 
@@ -1054,10 +1054,17 @@ function creer_repertoire($base, $subdir) {
 //
 // Entetes
 //
+
+// Interdire les attaques par manipulation des headers
+function spip_header($h) {
+	@header(strtr($h, "\n\r", "  "));
+}
+
+// envoyer le navigateur sur une nouvelle adresse
 function redirige_par_entete($url) {
 	spip_log("redirige $url");
 	http_status(302);
-	header("Location: $url");
+	spip_header("Location: $url");
 	exit;
 }
 
diff --git a/ecrire/install.php3 b/ecrire/install.php3
index 32893b6fc5..7c5158c58b 100644
--- a/ecrire/install.php3
+++ b/ecrire/install.php3
@@ -499,13 +499,13 @@ else if ($etape == 1) {
 
 }
 else if ($etape == 'dirs') {
-	header("Location: ../spip_test_dirs.php3");
+	redirige_par_entete("../spip_test_dirs.php3");
 }
 else if (!$etape) {
 	$menu_langues = menu_langues('var_lang_ecrire');
 
 	if (!$menu_langues)
-		header("Location: ../spip_test_dirs.php3");
+		redirige_par_entete("../spip_test_dirs.php3");
 	else {
 		install_debut_html();
 		echo _VALIDE_CLAVIER;
diff --git a/ecrire/unpack.php3 b/ecrire/unpack.php3
index 7a21fb84a1..960d73fbc7 100644
--- a/ecrire/unpack.php3
+++ b/ecrire/unpack.php3
@@ -26,10 +26,10 @@ $hash = calculer_action_auteur("unpack");
 fin_admin($action);
 
 if (@file_exists("../spip_loader.php3"))
-	@header("Location: ../spip_loader.php3?hash=$hash&id_auteur=$connect_id_auteur");
+	redirige_par_entete("../spip_loader.php3?hash=$hash&id_auteur=$connect_id_auteur");
 else if (@file_exists("../spip_unpack.php3"))
-	@header("Location: ../spip_unpack.php3?hash=$hash&id_auteur=$connect_id_auteur");
+	redirige_par_entete("../spip_unpack.php3?hash=$hash&id_auteur=$connect_id_auteur");
 else
-	@header("Location: ../spip_loader.php3?hash=$hash&id_auteur=$connect_id_auteur");
+	redirige_par_entete("../spip_loader.php3?hash=$hash&id_auteur=$connect_id_auteur");
 
 ?>
diff --git a/ecrire/upgrade.php3 b/ecrire/upgrade.php3
index e09e3279b9..0160c21540 100644
--- a/ecrire/upgrade.php3
+++ b/ecrire/upgrade.php3
@@ -89,8 +89,10 @@ fin_admin($upgrade_titre);
 
 if ($ok) {
 	$hash = calculer_action_auteur("purger_cache");
-	@header ("Location: ../spip_cache.php3?purger_cache=oui&id_auteur=$connect_id_auteur&hash=$hash&redirect=" .  _DIR_RESTREINT_ABS . "index.php3");
- }
+	redirige_par_entete("../spip_cache.php3?purger_cache=oui"
+		."&id_auteur=$connect_id_auteur&hash=$hash"
+		."&redirect=" .  _DIR_RESTREINT_ABS . "index.php3");
+}
 else {
 	include_ecrire ('inc_lang.php3');
 	echo _T('alerte_maj_impossible', array('version' => $spip_version));
diff --git a/inc-calcul.php3 b/inc-calcul.php3
index 5977b52481..35319a66dc 100644
--- a/inc-calcul.php3
+++ b/inc-calcul.php3
@@ -236,7 +236,7 @@ function calculer_page_globale($cache, $contexte_local, $fond) {
 				if ($url) { // sinon les navigateurs pataugent
 					$url = texte_script(str_replace('&amp;', '&', $url));
 					$page = array('texte' => "<".
-					"?php header('Location: $url'); ?" . ">",
+					"?php redirige_par_entete('$url'); ?" . ">",
 					'process_ins' => 'php');
 				}
 			}
diff --git a/inc-urls-propres.php3 b/inc-urls-propres.php3
index a04e7ffb69..f38017ab72 100644
--- a/inc-urls-propres.php3
+++ b/inc-urls-propres.php3
@@ -202,8 +202,7 @@ preg_match(',(^|/)((article|breve|rubrique|mot|auteur|site)(\.php3?|[0-9]+\.html
 				// recuperer les arguments supplementaires (&debut_xxx=...)
 				$reste = preg_replace('/^&/','?',
 					preg_replace("/[?&]$id_table_objet=$id_objet/",'',$regs[5]));
-				Header("Location: $url_propre$reste");
-				exit;
+				redirige_par_entete("$url_propre$reste");
 			}
 		}
 		return;
diff --git a/spip_background.php3 b/spip_background.php3
index 01e394072a..6ee3d03628 100644
--- a/spip_background.php3
+++ b/spip_background.php3
@@ -14,10 +14,9 @@
 // Du cote de la page HTML, utiliser un background-image en feuille de style
 // plutot qu'un <img>, c'est plus discret notamment sous navigateur texte
 $image = pack("H*", "47494638396118001800800000ffffff00000021f90401000000002c0000000018001800000216848fa9cbed0fa39cb4da8bb3debcfb0f86e248965301003b");
-$size = strlen($image);
 
 Header("Content-Type: image/gif");
-Header("Content-Length: ".$size);
+Header("Content-Length: ".strlen($image));
 Header("Cache-Control: no-cache,no-store");
 Header("Pragma: no-cache");
 Header("Connection: close");
diff --git a/spip_cookie.php3 b/spip_cookie.php3
index bbd68e1023..ab39b07a78 100644
--- a/spip_cookie.php3
+++ b/spip_cookie.php3
@@ -236,7 +236,7 @@ if (ereg("^Apache", $SERVER_SOFTWARE)) {
 	redirige_par_entete($redirect);
 }
 else {
-	@header("Refresh: 0; url=" . $redirect);
+	spip_header("Refresh: 0; url=" . $redirect);
 	echo "<html><head>";
 	echo "<meta http-equiv='Refresh' content='0; url=".$redirect."'>";
 	echo "</head>\n";
diff --git a/spip_login.php3 b/spip_login.php3
index 4c9b8ff21d..f74c9a5b21 100644
--- a/spip_login.php3
+++ b/spip_login.php3
@@ -19,10 +19,9 @@ $forcer_lang = true;
 // Compatibilite anciennes versions de SPIP : si un 'var_url' (cible du login)
 // est passe, renvoyer vers la meme adresse mais avec 'url'
 if (isset($_SERVER['REQUEST_URI'])
-AND strpos($_SERVER['REQUEST_URI'], 'var_url')) {
-	header('Location: '.str_replace('var_url', 'url', $_SERVER['REQUEST_URI']));
-	exit;
-}
+AND strpos($_SERVER['REQUEST_URI'], 'var_url'))
+	redirige_par_entete(str_replace('var_url', 'url', $_SERVER['REQUEST_URI']));
+
 // Fin compatibilite
 
 include ("inc-public.php3");
-- 
GitLab