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 " × <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('&', '&', $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