Skip to content
Extraits de code Groupes Projets
Valider 4fccee33 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

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)
parent d192dab2
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -19,8 +19,8 @@ include_spip('inc/cookie'); ...@@ -19,8 +19,8 @@ include_spip('inc/cookie');
function action_cookie_dist() { function action_cookie_dist() {
// La cible de notre operation de connexion // La cible de notre operation de connexion
$url = _request('url'); $url = securiser_redirect_action(_request('url'));
$redirect = isset($url) ? $url : _DIR_RESTREINT; $redirect = $url ? $url : generer_url_ecrire('accueil');
$redirect_echec = _request('url_echec'); $redirect_echec = _request('url_echec');
if (!isset($redirect_echec)) { if (!isset($redirect_echec)) {
if (strpos($redirect,_DIR_RESTREINT_ABS)!==false) if (strpos($redirect,_DIR_RESTREINT_ABS)!==false)
......
...@@ -210,6 +210,16 @@ function set_request($var, $val = NULL, $c=false) { ...@@ -210,6 +210,16 @@ function set_request($var, $val = NULL, $c=false) {
return false; # n'affecte pas $c 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. // Prend une URL et lui ajoute/retire un parametre.
// Exemples : [(#SELF|parametre_url{suite,18})] (ajout) // Exemples : [(#SELF|parametre_url{suite,18})] (ajout)
......
...@@ -24,7 +24,7 @@ include_spip('inc/cookie'); ...@@ -24,7 +24,7 @@ include_spip('inc/cookie');
// Determiner l'action demandee // Determiner l'action demandee
// //
$exec = _request('exec'); $exec = (string)_request('exec');
$reinstall = _request('reinstall')?_request('reinstall'):($exec=='install'?'oui':NULL); $reinstall = _request('reinstall')?_request('reinstall'):($exec=='install'?'oui':NULL);
// //
// Les scripts d'insallation n'authentifient pas, forcement, // Les scripts d'insallation n'authentifient pas, forcement,
......
...@@ -38,7 +38,7 @@ if (isset($GLOBALS['_INC_PUBLIC'])) { ...@@ -38,7 +38,7 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {
// fond demande dans l'url par page=xxxx ? // fond demande dans l'url par page=xxxx ?
else if (isset($_GET[_SPIP_PAGE])) { else if (isset($_GET[_SPIP_PAGE])) {
$fond = $_GET[_SPIP_PAGE]; $fond = (string)$_GET[_SPIP_PAGE];
// Securite // Securite
if (strstr($fond, '/') if (strstr($fond, '/')
......
...@@ -12,6 +12,12 @@ ...@@ -12,6 +12,12 @@
if (!defined('_ECRIRE_INC_VERSION')) return; 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 // http://doc.spip.org/@traiter_appels_actions
function traiter_appels_actions(){ function traiter_appels_actions(){
// cas de l'appel qui renvoie une redirection (302) ou rien (204) // cas de l'appel qui renvoie une redirection (302) ou rien (204)
...@@ -30,13 +36,17 @@ function traiter_appels_actions(){ ...@@ -30,13 +36,17 @@ function traiter_appels_actions(){
$url = parametre_url($url,'var_ajax',$v,'&'); $url = parametre_url($url,'var_ajax',$v,'&');
$url = parametre_url($url,'var_ajax_env',$args,'&'); $url = parametre_url($url,'var_ajax_env',$args,'&');
set_request('redirect',$url); set_request('redirect',$url);
} }
else if(_request('redirect')){
set_request('redirect',securiser_redirect_action(_request('redirect')));
}
$var_f = charger_fonction($action, 'action'); $var_f = charger_fonction($action, 'action');
$var_f(); $var_f();
if (!isset($GLOBALS['redirect'])) { if (!isset($GLOBALS['redirect'])) {
$GLOBALS['redirect'] = _request('redirect'); $GLOBALS['redirect'] = _request('redirect');
if ($_SERVER['REQUEST_METHOD'] == 'POST') if ($_SERVER['REQUEST_METHOD'] == 'POST')
$GLOBALS['redirect'] = urldecode($GLOBALS['redirect']); $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']);
$GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']);
} }
if ($url = $GLOBALS['redirect']) { if ($url = $GLOBALS['redirect']) {
// si l'action est provoque par un hit {ajax} // si l'action est provoque par un hit {ajax}
......
...@@ -15,8 +15,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; ...@@ -15,8 +15,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('base/abstract_sql'); include_spip('base/abstract_sql');
function is_url_prive($cible){ function is_url_prive($cible){
$parse = parse_url($cible); include_spip('inc/filtres_mini');
return strncmp(substr($parse['path'],-strlen(_DIR_RESTREINT_ABS)), _DIR_RESTREINT_ABS, strlen(_DIR_RESTREINT_ABS))==0; $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) function formulaires_login_charger_dist($cible="",$login="",$prive=null)
...@@ -194,7 +195,7 @@ function formulaires_login_traiter_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 // si c'est une url absolue, refuser la redirection
// sauf si cette securite est levee volontairement par le webmestre // 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 = ""; $cible = "";
} }
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter