From 18a0dce608f58a62a17553f85a7b2734b0b5c416 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Sat, 23 Sep 2006 08:20:16 +0000 Subject: [PATCH] =?UTF-8?q?Acc=C3=A8s=20interdits=20excessif=20depuis=20le?= =?UTF-8?q?=20renforcement=20de=20s=C3=A9curit=C3=A9:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - en PHP_AUTH (dont LDAP) il faut forcer la récréation du fichier de session quand il n'est plus compatible avec le cookie; - le id_auteur retiré de l'URL lors de [7329] était en fait encore nécessaire pour le mode PHP_AUTH lors d'une action (car il n'y a pas forcément un .htacces au niveau du répertoire public); mais il sufit de se rabattre sur le cookie, ce qui est d'ailleurs beaucoup plus sécurisé qu'auparavant; - et enfin il est normal que le id_auteur soit vide pour les forums anonymes. --- ecrire/inc/actions.php | 42 +++++++++++++++++++++++++++++------------- ecrire/inc/auth.php | 8 +++++--- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php index 2d99c50484..7f5dd790c0 100644 --- a/ecrire/inc/actions.php +++ b/ecrire/inc/actions.php @@ -23,27 +23,42 @@ function inc_controler_action_auteur_dist() $arg = _request('arg'); $hash = _request('hash'); $action = _request('action'); - $id_auteur = $GLOBALS['auteur_session']['id_auteur']; - if (!verifier_action_auteur("$action-$arg", $hash, $id_auteur)) { + if (!verifier_action_auteur("$action-$arg", $hash)) { include_spip('inc/minipres'); minipres(_T('info_acces_interdit')); } } // http://doc.spip.org/@caracteriser_auteur -function caracteriser_auteur($id_auteur=0) { +function caracteriser_auteur() { global $auteur_session; - if (!$id_auteur = intval($id_auteur)) - $id_auteur = $auteur_session['id_auteur']; + static $caracterisation = array(); + if ($caracterisation) return $caracterisation; + + $id_auteur = $auteur_session['id_auteur']; + if (!$id_auteur) { + // si l'auteur courant n'est pas connu alors qu'il peut demander une action + // c'est une connexion par php_auth, on se rabat sur le cookie. + // S'il n'avait pas le droit de realiser cette action, le hash sera faux. + if (isset($_COOKIE['spip_session']) + AND (preg_match('/^(\d+)/',$_COOKIE['spip_session'],$r))) { + return array($r[1], ''); + // Necessaire aux forums anonymes. + // Pour le reste, ca echouera. + } else return array('',''); + } // Eviter l'acces SQL si le pass est connu de PHP + if ($auteur_session['pass']) - return array($id_auteur, $auteur_session['pass']); + return $caracterisation = array($id_auteur, $auteur_session['pass']); else { $t = spip_query("SELECT id_auteur, pass FROM spip_auteurs WHERE id_auteur=$id_auteur"); - if (!$t = spip_fetch_array($t)) die(_L("Faut pas se gener")); - return array($t['id_auteur'], $t['pass']); + if ($t = spip_fetch_array($t)) + return $caracterisation = array($t['id_auteur'], $t['pass']); + spip_log("auteur $id_auteur sans caracterisation"); + die(_T('info_acces_interdit')); } } @@ -53,14 +68,14 @@ function _action_auteur($action, $id_auteur, $pass, $nom_alea) { } // http://doc.spip.org/@calculer_action_auteur -function calculer_action_auteur($action, $id_auteur = 0) { - list($id_auteur, $pass) = caracteriser_auteur($id_auteur); +function calculer_action_auteur($action) { + list($id_auteur, $pass) = caracteriser_auteur(); return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'); } // http://doc.spip.org/@verifier_action_auteur -function verifier_action_auteur($action, $valeur, $id_auteur = 0) { - list($id_auteur, $pass) = caracteriser_auteur($id_auteur); +function verifier_action_auteur($action, $valeur) { + list($id_auteur, $pass) = caracteriser_auteur(); if ($valeur == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) return true; @@ -226,7 +241,8 @@ function verifier_php_auth() { } } } - } + } + return false; } // diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php index 540f14d634..571df92098 100644 --- a/ecrire/inc/auth.php +++ b/ecrire/inc/auth.php @@ -43,7 +43,9 @@ function acces_mots() { // http://doc.spip.org/@acces_article function acces_article($id_article) { - global $connect_id_auteur; + global $connect_id_auteur, $connect_toutes_rubriques; + + if ($connect_toutes_rubriques) return true; $row = spip_fetch_array(spip_query("SELECT id_rubrique, statut FROM spip_articles WHERE id_article=$id_article")); @@ -120,10 +122,10 @@ function inc_auth_dist() { $var_f = charger_fonction('session', 'inc'); if ($connect_id_auteur = $var_f()) { $auth_can_disconnect = true; - } + } else unset($_COOKIE['spip_session']); } - // sinon, essayer auth http si significatif + // Essayer auth http si significatif // (ignorer les login d'intranet independants de spip) if (!$ignore_auth_http AND !$connect_id_auteur) { if ($_SERVER['PHP_AUTH_USER'] AND $_SERVER['PHP_AUTH_PW']) { -- GitLab