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