/** * Verifie si le cookie spip_session indique une session valide. * Si oui, la decrit dans le tableau $visiteur_session et retourne id_auteur * La rejoue si IP change puis accepte le changement si $change=true * * Retourne false en cas d'echec, l'id_auteur de la session si defini, null sinon * * http://code.spip.net/@verifier_session * * @param bool $change * @return bool|int|null */ function verifier_session($change = false) { // si pas de cookie, c'est fichu if (!isset($_COOKIE['spip_session'])) { return false; } $fichier_session = ""; // est-ce une session anonyme ? if (!intval($_COOKIE['spip_session'])) { session_start(); if (!isset($_SESSION[$_COOKIE['spip_session']]) or !is_array($_SESSION[$_COOKIE['spip_session']])) { return false; } $GLOBALS['visiteur_session'] = $_SESSION[$_COOKIE['spip_session']]; } else { // Tester avec alea courant $fichier_session = fichier_session('alea_ephemere', true); if ($fichier_session and @file_exists($fichier_session)) { include $fichier_session; } else { // Sinon, tester avec alea precedent $fichier_session = fichier_session('alea_ephemere_ancien', true); if (!$fichier_session or !@file_exists($fichier_session)) { return false; } // Renouveler la session avec l'alea courant include $fichier_session; spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], "session"); spip_unlink($fichier_session); ajouter_session($GLOBALS['visiteur_session']); } } // Compatibilite ascendante : auteur_session est visiteur_session si // c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut // n'etre qu'identifie, sans aucune authentification). if (isset($GLOBALS['visiteur_session']['id_auteur']) and $GLOBALS['visiteur_session']['id_auteur']) { $GLOBALS['auteur_session'] =& $GLOBALS['visiteur_session']; } // Si l'adresse IP change, inc/presentation mettra une balise image // avec un URL de rappel demandant a changer le nom de la session. // Seul celui qui a l'IP d'origine est rejoue // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter // sa victime, mais se ferait deconnecter par elle. if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) { if (!$GLOBALS['visiteur_session']['ip_change']) { define('_SESSION_REJOUER', rejouer_session()); $GLOBALS['visiteur_session']['ip_change'] = true; ajouter_session($GLOBALS['visiteur_session']); } else { if ($change) { spip_log("session non rejouee, vol de cookie ?", "session"); } } } else { if ($change) { spip_log("rejoue session {$fichier_session} " . $_COOKIE['spip_session'], "session"); if ($fichier_session) { spip_unlink($fichier_session); } $GLOBALS['visiteur_session']['ip_change'] = false; unset($_COOKIE['spip_session']); ajouter_session($GLOBALS['visiteur_session']); } } // Si la session a ete initiee il y a trop longtemps, elle est annulee if (isset($GLOBALS['visiteur_session']) and defined('_AGE_SESSION_MAX') and _AGE_SESSION_MAX > 0 and time() - @$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX) { unset($GLOBALS['visiteur_session']); return false; } return is_numeric($GLOBALS['visiteur_session']['id_auteur']) ? $GLOBALS['visiteur_session']['id_auteur'] : null; }
} } else { if (_request('logout')) { $cible = new Link("index.php"); } else { $cible = new Link(); } // [ML] XXX uses current page, but this can create strange bugs.. } // Replay the cookie to renew lcm_session if (_request('change_session') == 'yes' || _request('change_session') == 'oui') { if (verifier_session($_COOKIE['lcm_session'])) { // Warning: only the user with the correct IP has the right to replay // the cookie, therefore a cookie theft cannot disconnect the vitim // but be disconnected by her. if ($author_session['hash_env'] == hash_env()) { $author_session['ip_change'] = false; $cookie = creer_cookie_session($author_session); delete_session($_COOKIE['lcm_session']); lcm_setcookie('lcm_session', $cookie); } @header('Content-Type: image/gif'); @header('Expires: 0'); @header("Cache-Control: no-store, no-cache, must-revalidate"); @header('Pragma: no-cache'); @header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); @readfile('ecrire/img_pack/rien.gif'); // XXX change this exit; } }
function verifier_session($change=false) { // si pas de cookie, c'est fichu if (!isset($_COOKIE['spip_session'])) return false; // Tester avec alea courant $fichier_session = fichier_session('alea_ephemere', true); if ($fichier_session AND @file_exists($fichier_session)) { include($fichier_session); } else { // Sinon, tester avec alea precedent $fichier_session = fichier_session('alea_ephemere_ancien', true); if (!$fichier_session OR !@file_exists($fichier_session)) return false; // Renouveler la session avec l'alea courant include($fichier_session); spip_unlink($fichier_session); ajouter_session($GLOBALS['visiteur_session']); } // Compatibilite ascendante : auteur_session est visiteur_session si // c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut // n'etre qu'identifie, sans aucune authentification). if ($GLOBALS['visiteur_session']['id_auteur']) $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; // Si l'adresse IP change, inc/presentation mettra une balise image // avec un URL de rappel demandant a changer le nom de la session. // Seul celui qui a l'IP d'origine est rejoue // ainsi un eventuel voleur de cookie ne pourrait pas deconnecter // sa victime, mais se ferait deconnecter par elle. if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) { if (!$GLOBALS['visiteur_session']['ip_change']) { $GLOBALS['rejoue_session'] = rejouer_session(); $GLOBALS['visiteur_session']['ip_change'] = true; ajouter_session($GLOBALS['visiteur_session']); } else if ($change) { spip_log("session non rejouee, vol de cookie ?"); } } else if ($change) { spip_log("rejoue session $fichier_session ".$_COOKIE['spip_session']); spip_unlink($fichier_session); $GLOBALS['visiteur_session']['ip_change'] = false; unset($_COOKIE['spip_session']); ajouter_session($GLOBALS['visiteur_session']); } return is_numeric($GLOBALS['visiteur_session']['id_auteur'])?$GLOBALS['visiteur_session']['id_auteur']:null; }
function creer_cookie_session($author) { if ($id_author = $author['id_author']) { $id_session = $id_author . '_' . md5(create_uniq_id()); $author['hash_env'] = hash_env(); lcm_add_session($author, $id_session); return $id_session; } }