From 4fccee333bbbb6100b7f033ddccd5402a3ef1465 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 6 Jan 2011 14:31:38 +0000
Subject: [PATCH] report securite de r16904 r16905 r16906 : Securite :
 redirections absolues depuis les actions (Matsuyama) introduire une fonction
 tester_url_absolue() qui teste si une url est absolue. L'utiliser dans le
 formulaire login et dans la securisation du parametre redirect de toutes les
 actions via public/aiguiller...

securite : cast sur $exec (Matsuyama)

securite : cast string sur la variable page de l'url (Matsuyama)
---
 ecrire/action/cookie.php    |  4 ++--
 ecrire/inc/utils.php        | 10 ++++++++++
 ecrire/index.php            |  2 +-
 ecrire/public.php           |  2 +-
 ecrire/public/aiguiller.php | 12 +++++++++++-
 prive/formulaires/login.php |  7 ++++---
 6 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 6882e44dae..9d71e8b985 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -19,8 +19,8 @@ include_spip('inc/cookie');
 function action_cookie_dist() {
 
 	// La cible de notre operation de connexion
-	$url = _request('url');
-	$redirect = isset($url) ? $url : _DIR_RESTREINT;
+	$url = securiser_redirect_action(_request('url'));
+	$redirect = $url ? $url : generer_url_ecrire('accueil');
 	$redirect_echec = _request('url_echec');
 	if (!isset($redirect_echec)) {
 		if (strpos($redirect,_DIR_RESTREINT_ABS)!==false)
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 24dc2cca55..a5348673a1 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -210,6 +210,16 @@ function set_request($var, $val = NULL, $c=false) {
 	return false; # n'affecte pas $c
 }
 
+
+/**
+ * Tester si une url est absolue
+ * @param  $url
+ * @return bool
+ */
+function tester_url_absolue($url){
+	return preg_match(";^([a-z]+:)?//;Uims",trim($url))?true:false;
+}
+
 //
 // Prend une URL et lui ajoute/retire un parametre.
 // Exemples : [(#SELF|parametre_url{suite,18})] (ajout)
diff --git a/ecrire/index.php b/ecrire/index.php
index a1c1e583ba..a175a333fe 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -24,7 +24,7 @@ include_spip('inc/cookie');
 // Determiner l'action demandee
 //
 
-$exec = _request('exec');
+$exec = (string)_request('exec');
 $reinstall = _request('reinstall')?_request('reinstall'):($exec=='install'?'oui':NULL);
 //
 // Les scripts d'insallation n'authentifient pas, forcement,
diff --git a/ecrire/public.php b/ecrire/public.php
index 9a89e4b8b2..a4702dd0da 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -38,7 +38,7 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {
 
 	// fond demande dans l'url par page=xxxx ?
 	else if (isset($_GET[_SPIP_PAGE])) {
-		$fond = $_GET[_SPIP_PAGE];
+		$fond = (string)$_GET[_SPIP_PAGE];
 
 		// Securite
 		if (strstr($fond, '/')
diff --git a/ecrire/public/aiguiller.php b/ecrire/public/aiguiller.php
index 7f7974d50a..414b51ac1d 100644
--- a/ecrire/public/aiguiller.php
+++ b/ecrire/public/aiguiller.php
@@ -12,6 +12,12 @@
 
 if (!defined('_ECRIRE_INC_VERSION')) return;
 
+function securiser_redirect_action($redirect){
+	if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT'))
+		$redirect = "";
+	return $redirect;
+}
+
 // http://doc.spip.org/@traiter_appels_actions
 function traiter_appels_actions(){
 	// cas de l'appel qui renvoie une redirection (302) ou rien (204)
@@ -30,13 +36,17 @@ function traiter_appels_actions(){
 			$url = parametre_url($url,'var_ajax',$v,'&');
 			$url = parametre_url($url,'var_ajax_env',$args,'&');
 			set_request('redirect',$url);
-		}		
+		}
+		else if(_request('redirect')){
+			set_request('redirect',securiser_redirect_action(_request('redirect')));
+		}
 		$var_f = charger_fonction($action, 'action');
 		$var_f();
 		if (!isset($GLOBALS['redirect'])) {
 			$GLOBALS['redirect'] = _request('redirect');
 			if ($_SERVER['REQUEST_METHOD'] == 'POST')
 				$GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
+			$GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
 		}
 		if ($url = $GLOBALS['redirect']) {
 			// si l'action est provoque par un hit {ajax}
diff --git a/prive/formulaires/login.php b/prive/formulaires/login.php
index c999804053..f14de6ac23 100644
--- a/prive/formulaires/login.php
+++ b/prive/formulaires/login.php
@@ -15,8 +15,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
 include_spip('base/abstract_sql');
 
 function is_url_prive($cible){
-	$parse = parse_url($cible);
-	return strncmp(substr($parse['path'],-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0;
+	include_spip('inc/filtres_mini');
+	$path = parse_url(tester_url_absolue($cible)?$cible:url_absolue($cible),PHP_URL_PATH);
+	return strncmp(substr($path,-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0;
 }
 
 function formulaires_login_charger_dist($cible="",$login="",$prive=null)
@@ -194,7 +195,7 @@ function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
 
 		// si c'est une url absolue, refuser la redirection
 		// sauf si cette securite est levee volontairement par le webmestre
-		elseif (preg_match(";^([a-z]+:)?//;Uims",$cible) AND !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
+		elseif (tester_url_absolue($cible) AND !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
 			$cible = "";
 		}
 	}
-- 
GitLab