Esempio n. 1
0
/**
 * 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;
}
Esempio n. 2
0
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;
}