예제 #1
0
파일: session.php 프로젝트: JLuc/SPIP
/**
 * 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;
}
예제 #2
0
    }
} 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;
    }
}
예제 #3
0
파일: session.php 프로젝트: rhertzog/lcs
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;
}
예제 #4
0
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;
    }
}