IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Pertes des variables de session entre 2 session_start()


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Points : 33
    Points
    33
    Par défaut Pertes des variables de session entre 2 session_start()
    Salut!

    Alors j'ai un gros problème avec les sessions. Après avoir lu les tutoriels de deveveloppez.com, j'ai décidé de m'y mettre. Le problème c'est que entre 2 session_start() je perds toutes les variables instanciées dans $_SESSION... Que ce soit dans la page qui suit directement ou pas.

    Quelqu'un pourrais m'aider s'il vous plait?

    Voici le code du formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <div>
    	<form name="Login" method="post" action="Seraphic-Session/Authentification.php" onsubmit="javascript:submit_pass();">
    		<div>
    			<input type="hidden" name="Secret" />
    			Login:
    			<input type="text" name="Login" />
    			Mot de passe:
    			<input type="password" name="Password" />
    			<input type="submit" name="Envoyer" value="Envoyer" />
    		</div>
    	</form>
    </div>
    La fonction javascript appelée se contente d'effacer le champ Password et de l'encode dans Secret.

    Voici le code d'Authentification.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
     
    include('Sessions.php');
     
     
    function connect()
     
    {
     
    	include_once("../BDD/BDD.php");
     
    	mysql_connect(SQL_HOST,SQL_USER,SQL_PASSWORD) or die('<h1>Connexion au serveur impossible.</h1>');
     
    	mysql_select_db(SQL_DATABASE) or die('<h1>Connexion impossible à la base.</h1>');
     
    }
     
    function FormulaireValide()
    {
    	return (isset($_POST['Login']) && isset($_POST['Secret']));
    }
     
    function UtilisateurValide($login,$pass)
    {
    	connect();
    	$r = mysql_query("
    	SELECT COUNT(*)
    	FROM Membres
    	WHERE Identifiant='$login'
    	AND Password='$pass'
    	") or die('Echec de connection!');
     
    	mysql_close();
    	$r = mysql_fetch_array($r);
    	return $r[0]==1;
    }
     
    function OuvrirSession($login,$pass)
    {
     
    	session_set();
    	session_start();
    	$_SESSION['DernierAcces'] = time();
    	$_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
    	connect();
    	$r = mysql_query("
    	SELECT Pseudo, Rang
    	FROM Membres
    	WHERE Identifiant='$login'
    	AND Password='$pass'
    	") or die('Echec de connection!');
     
    	mysql_close();
    	$r = mysql_fetch_array($r);
    	$_SESSION['User'] = $r['Pseudo'];
    	$_SESSION['Rang'] = $r['Rang'];
     
    	header("Location: ../admin/Article.php");
    }
     
    function SessionValide()
    {
    	if(!FormulaireValide() || !UtilisateurValide($_POST['Login'],$_POST['Secret']))
    	{
    		header("Location: ../?page=Login.php");
     		die();
    	}else{
    		OuvrirSession($_POST['Login'],$_POST['Secret']);
    	}
    }
     
    SessionValide();
     
    ?>
    Ce script permet de loguer l'utilisateur si il existe. Jusque là tout marche, j'arrive à me loguer.

    Le script suivant contient session_set(), une fonction permettant de modifier la gestion des sessions afin d'utiliser une base de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    <?php
     
    function ouvrir_session($chemin_de_stockage, $nom_de_session)
    {
      $_ENV['nom_de_session'] = $nom_de_session;
      return true;
    }
     
    function fermer_session()
    {
      return true; // Rien à faire
    }
     
    function lire_session($identifiant_de_session)
    {
    	connect();
    	$resultat = mysql_query("
    		SELECT Donnees
    		FROM Sessions
    		WHERE Identifiant = '".$identifiant_de_session."'
    		AND Nom='".$_ENV['nom_de_session']."'
    	");
    	$Donnees = '';
    	if(mysql_num_rows($resultat) == 1)
    	{
    		$Donnees = mysql_fetch_array($resultat);
    	}
    	mysql_free_result($resultat);
    	mysql_close();
    	return strval($Donnees['Donnees']);
    }
     
    function ecrire_session($identifiant_de_session, $donnees_de_session)
    {
     
    	connect();
    	$result = true;
    	mysql_query("
    		UPDATE Session
    		SET Donnees = '".$donnees_de_session."'
    		WHERE Identifiant = '".$identifiant_de_session."'
    		AND Nom = '".$_ENV['nom_de_session']."'
    	") or $result = false;
       mysql_close();
       return $result;
    }
     
    function detruire_session($identifiant_de_session)
    {
    	connect();
    	$result = true;
    	mysql_query("
    		DELETE FROM Sessions
    		WHERE Identifiant = '".$identifiant_de_session."'
    		AND Nom ='".$_ENV['nom_de_session']."'"
    	) or $result = false;
    	mysql_close();
       return $result;
    }
     
    function verifier_validite_session($temps_de_validite)
    {
       connect();
       $result = true;
       mysql_query("
       	DELETE FROM Sessions
       	WHERE ADDDATE(DernierAcces, INTERVAL".$temps_de_validite." SECOND) < NOW()
       ") or $result = false;
       mysql_close();
       return $result;
    }
     
    function session_set()
    {
    	session_set_save_handler(
    		'ouvrir_session',
    		'fermer_session',
    		'lire_session',
    		'ecrire_session',
    		'detruire_session',
    		'verifier_validite_session'
    	);
    }
     
    ?>
    Ce qui me chiffonne dans ce code pris dans le tutoriel pour les sessions avec BDD c'est que je ne vois pas d'insertion de tuples avec un INSERT.

    Le problème est quand j'arrive à la page ../admin/Article.php: je suis immédiatement redirigé vers la page de loggin.

    Voici le code du script en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
    include('../Seraphic-Session/VerificationSession.php');
     
    function main()
    {
    	if (!estRedacteur())
    	{
    		header('Location: ..');
    	}else{
     
    		if (!isset($_GET["art"]) || !(estModerateur() || estAuteurDe('Article',$_GET["art"]))) {
     
    			ajouterArticle();
     
    		}else{
    			modifierArticle($_GET["art"]);
     
    		}
     
    		afficheArticles();
     
    	}
    }
    main();
     
    ?>
    Les fonctions ajouterArticle et modifierArticle n'ont pas de grand intêret pour ce problème, elles marchent déjà.

    Pour vérifier que la session n'est pas usurpée, le script VerificationSession.php s'en charge, voici son contenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
     
    include('Sessions.php');
    include('Droits.php');
     
    function VerifierSession()
    {
    	if(
    		!isset($_SESSION['DernierAcces']) ||
    		!isset($_SESSION['IP']) ||
    		!isset($_SESSION['User']) ||
    		$_SERVER['REMOTE_ADDR']!=$_SESSION['IP']
    	)
    	{
    		$_SESSION=array();
    		session_destroy();
    		header("Location: ../?page=Login.php");
    		die();
    	}
    }
     
    session_set();
    session_start();
    VerifierSession();
    $_SESSION['DernierAcces'] = time();
     
    ?>
    Vient ensuite la bibliothèque Droits.php qui permet de savoir si l'utilisateur a accès à telle ou telle page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
     
    function estModerateur()
    {
    	if (!isset($_SESSION['Rang']))
    	{
    		return false;
    	}
    	connect();
    	$r = mysql_query("
    		SELECT Moderateur
    		FROM Rangs
    		WHERE Niveau=" . $_SESSION['Rang']
    	)or die('Echec niveau mod&eacute;rateur<br />' . mysql_error());
    	mysql_close();
    	$r = mysql_fetch_array($r);
    	return $r['Moderateur']==1;
    }
     
    function estRedacteur()
    {
    	if (!isset($_SESSION['Rang']))
    	{
    		return false;
    	}
    	connect();
    	$r = mysql_query("
    		SELECT Redacteur
    		FROM Rangs
    		WHERE Niveau=" . $_SESSION['Rang']
    	)or die('Echec niveau r&eacute;dacteur<br />' . mysql_error());
    	mysql_close();
    	$r = mysql_fetch_array($r);
    	return $r['Redacteur']==1;
    }
     
    function estMembre()
    {
    	if (!isset($_SESSION['Rang']))
    	{
    		return false;
    	}
    	connect();
    	$r = mysql_query("
    		SELECT Utilisateur
    		FROM Rangs
    		WHERE Niveau=" . $_SESSION['Rang']
    	)or die('Echec niveau membre<br />' . mysql_error());
    	mysql_close();
    	$r = mysql_fetch_array($r);
    	return $r['Utilisateur']==1;
    }
     
    function estAuteurDe($Type,$id)
    {
    	if (!estRedacteur() || !isset($_SESSION['User']))
    	{
    		return false;
    	}else{
    		connect();
    		$r = mysql_query("
    			SELECT COUNT(PosterArticle)
    			FROM $Type
    			WHERE Auteur=" . $_SESSION['User'] . "
    			AND Id$Type=$id
    		")or die('Echec niveau auteur<br />' . mysql_error());
    		mysql_close();
    		$r = mysql_fetch_array($r);
    		return $r[0]==1;
    	}
    }
     
     
    ?>
    Les fonctions de cette bibliothèque retournent des booléens.

    Cependant, j'ai eu la mauvaise surprise de voir que mes variables n'étaient plus instanciées (je les avais instanciées dans Authentification.php)

    si vous avez des idées, je vous écoute!

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Points : 33
    Points
    33
    Par défaut Bon bah...
    Bon, j'ai repassé 2 heures à relire ce que j'ai fait.

    Bon code, pour une page "sécurisée" s'éxécute de la façon suivante:
    • Définition de Fonctions
    • Modification du comportement de la session afin de prendre en charge la BDD
    • Début de la session avec session_start()
    • Tentative d'accès aux variables de session définies lors de l'authentification
    • Utilisation des variables


    J'espère que ça vous aidera à comprendre mon code.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Points : 33
    Points
    33
    Par défaut J'ai trouvé le problème!
    Apparemment quand je supprime carrément les session_set(), les sessions fonctionnent. Je n'utilise donc plus ma BDD mais le système de session par défaut.

    Le problème ne peut donc venir que de mon session_set() et donc de la façon dont je personnalise mes sessions... Pourtant, j'ai copié collé le contenu du tutorial de developpez.com sur sécuriser les sessions avec les BDD... et ça ne marche pas! Je deviens fou! Personne pour m'aider?

    Voila

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Est ce qu'avec ton code tu arrives à insérer les sessions dans ta base de données? car dans ta fonction "ecrire_session", il n'y a pas d'instruction SQL "INSERT" et je ne vois pas comment elles peuvent être insérées via une seule instruction UPDATE. Tu devrais :
    -soit vérifier l'existence de la session dans la table par un ordre SELECT et diriger ensuite vers un ordre UPDATE ou INSERT.
    -soit utiliser un ordre REPLACE qui te fera l'insertion si la session n'existe pas ou mettra à jour si la session est deja présente.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Points : 33
    Points
    33
    Par défaut Heu...
    Oki, je me disais aussi que l'absence de INSERT me semblait douteuse... Faudra que je pense à le signaler à la personne qui a fait le tutorial que j'ai suivi.

    En tout cas merci, je ferai les modifications vers la fin de la semaine prochaine, parce que je dois finir un projet qui m'embête pas mal, je vous tiens au courant!

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 61
    Points : 33
    Points
    33
    Par défaut Alors...
    J'ai essayé avec un REPLACE et la syntaxe suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function ouvrir_session($chemin_de_stockage, $nom_de_session)
    {
    	$_ENV['nom_de_session'] = $nom_de_session;
    	connect();
    	mysql_query("
    		INSERT INTO `Sessions`
    		VALUES (
    		'" . addslashes(session_id()) . "', '" . addslashes($nom_de_session) . "', NULL
    		)
    		ON DUPLICATE KEY UPDATE Nom='" . addslashes($nom_de_session) . "';
    	");
    	mysql_close();
    	return true;
    }
    Et c'est comme si je n'avais jamais inséré de tuples dans ma base. J'ai retiré le code qui retirait les tuples de ma base et aucun changements...

    Je ne comprends vraiment pas pourquoi ça ne marche pas...

Discussions similaires

  1. [MySQL] Perte des variables de session
    Par jcaspar dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/07/2010, 16h57
  2. Perte des variables de sessions
    Par Bizoo dans le forum Langage
    Réponses: 2
    Dernier message: 06/02/2010, 12h12
  3. Perte des variable de session au changement de page.
    Par [Xt-6] dans le forum Langage
    Réponses: 11
    Dernier message: 15/01/2009, 21h28
  4. Perte des variables de session aléatoire
    Par dnkz dans le forum Langage
    Réponses: 1
    Dernier message: 25/04/2008, 16h27
  5. Perte des variables de sessions
    Par Dayom dans le forum Langage
    Réponses: 12
    Dernier message: 17/07/2006, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo