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 :

Durée des sessions


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut Durée des sessions
    Bonjour,

    J'ai actuellement un léger problème de perte de Session.
    Je me demande quelques trucs.

    Sur la page X je creer une session, puis je vais sur la page Y, la session est toujours la normalement non ? Est-ce que si je vais sur la page Z elle est encore la ?

    Je suis actuellement sous wampserver.

    PS :
    session.save_handler = files
    session.use_cookies = 1
    session.use_only_cookies = 1
    session.name = PHPSESSID
    session.auto_start = 0
    session.cookie_lifetime = 0
    session.cookie_path = /
    session.cookie_domain =
    session.cookie_httponly =
    session.serialize_handler = php
    session.gc_probability = 1
    session.gc_divisor = 1000
    session.gc_maxlifetime = 1440
    session.bug_compat_42 = On
    session.bug_compat_warn = On
    session.referer_check =
    session.entropy_length = 0
    session.entropy_file =
    session.cache_limiter = nocache
    session.cache_expire = 180
    session.use_trans_sid = 0
    session.hash_function = 0
    session.hash_bits_per_character = 5

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Sur la page X je creer une session, puis je vais sur la page Y, la session est toujours la normalement non ? Est-ce que si je vais sur la page Z elle est encore la ?
    C'est le but des sessions.
    Mais n'as tu pas fais d'essai pour le constater ?
    Fait un print_r($_SESSION), ça te permet de voir ce que contient ta session, de même un eho session_name() et surtout echo session_id() pour son nom et sa valeur.

    Sa valeur (son identifiant unique) doit être la même dans toutes les pages, et il ne faudra pas oublier de mettre un session_start() dans les pages pour ça.

    C'est celle ci : session.gc_maxlifetime = 1440 qui définie la durée de la session : 1440 secondes, soit 24 minutes.

    N'oublie pas qu'il existe des tutos sur les sessions aussi.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut
    Donc c'est bien ca, j'ai bien pigé, pourtant imaginons, sur index je creer un token, je vais sur inscription, il y est toujours, puis quand je valide le formulaire (ps : le token n'a rien a voir avec CE formulaire) le token a disparut.

    Pourquoi ?

    Je fais un var_dump pour afficher $_SESSION.

    Ce que je pige pas, c'est que nul par il y a des session_destoy(), enfin si, mais englobé par une condition qui n'est pas respecté

    EDIT : Je dirais même plus. Si je vais sur inscription, le captcha s'ajoute, dès que je retourne sur index il reste, si je reclique sur index, il part ^o)

  4. #4
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    J'en sais rien ce qu'est un "token" ?
    Une variable de session ?

    Est tu certain que les session_start y soient ?
    As tu vérifié que l'id de session est bien le même ?
    Est ce que les autres données dans la sessions y sont, et leur valeur sont elles celles attendues ?

    Et puis à quel moment vérifie tu ce que contient la session ?
    Faut le faire le plus tôt, soit juste après le session_start().

    Au besoin, mets y du code.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  5. #5
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut
    Bon alors un token c'est un système de sécu pour la transmission de variable GET/POST. C'est dans une session


    Je fais un var_dump avec le start et j'en fait un à la quasi toute fin du site.
    Si je fait que refresh index, celle du debut, un coup sur deux est vide, et celle du bas toujours pleine (la c'est normal, car je recreer un token en permanence)

    l'id de session change toujours, est-ce parce que je redonne une nouvelle valeur à $_SESSION["token"] ?

    du code ?
    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    <?php
     
    session_start();
    var_dump($_SESSION);
    echo session_id();
    header('Content-type: text/html; charset=utf-8');
    include('includes/config.htm');
     
    /********Actualisation de la session...**********/
     
    include('includes/fonctions.htm');
    connexionbdd();
    actualiser_session();
     
    /********Fin actualisation de session...**********/
     
     
    /********Creation du token...**********/
    //On génére un jeton totalement unique (c'est capital :D)
    $token = md5(uniqid(rand(), true));
    //Et on le stocke
    $_SESSION['token'] = $token;
    //On enregistre aussi le timestamp correspondant au moment de la création du token
    $_SESSION['token_time'] = time();
    /********Fin creation du token...**********/
     
     
    /********Entête et titre de page*********/
     
    $titre = 'Index';
     
    include('includes/haut.htm'); //contient le doctype, et head.
     
    /**********Fin entête et titre***********/
    ?>
     
    		<div id="colonne_gauche">
    		<?php
    		include('includes/colg.htm');
    		?>
    		</div>
     
    		<div id="contenu">
    			<div id="map">
    				<a href="index.htm">Accueil</a>
    			</div>
     
     
     
    <?php
     
     
    if ((isset($_GET["err"])) || (isset($_GET["done"]))) {
    //On va vérifier :
    //Si le jeton est présent dans la session et dans le formulaire
    if(isset($_SESSION['retour_token']) && isset($_SESSION['retour_token_time']) && isset($_GET['token']))
    {
    	//Si le jeton de la session correspond à celui du formulaire
    	if($_SESSION['retour_token'] == $_GET['token'])
    	{
    		//On stocke le timestamp qu'il était il y a 2 minutes
    		$timestamp_ancien = time() - (2*60);
    		//Si le jeton n'est pas expiré
    		if($_SESSION['retour_token_time'] >= $timestamp_ancien)
    		{
    		unset($_SESSION['retour_token_time']);
    		unset($_SESSION['retour_token']);
    // Gestion des erreurs de add_offre_enchere.htm
    if (isset($_GET["err"])) {
    	$err = intval($_GET["err"]);
    	if ($err == 1)
    		echo "<font color=#FF0000><bold>Erreur: Montant invalide</bold></font><BR />";
    	elseif ($err == 2)
    		echo "<font color=#FF0000><bold>Erreur: Objet invalide</bold></font><BR />";
    	elseif ($err == 3)
    		echo "<font color=#FF0000><bold>Erreur: Offre déjà existante</bold></font><BR />";
    	elseif ($err == 4)
    		echo "<font color=#FF0000><bold>Erreur: Merci de refaire votre offre</bold></font><BR />";
    	elseif ($err == 5)
    		echo "<font color=#FF0000><bold>Erreur: Vous n'avez pas assez de tickets</bold></font><BR />";
    	elseif ($err == 6)
    		echo "<font color=#FF0000><bold>Erreur: L'enchère est fini</bold></font><BR />";
     
    }
     
     
    // Gestion des messages de reussite de add_offre_enchere.htm
    if (isset($_GET["done"])) {
    	$done = intval($_GET["done"]);
    	if ($done == 1)
    		echo "<font color=#00FF00><bold>Réussit: Offre placée</bold></font><BR />";
    	elseif ($done == 2)
    		echo "<font color=#00FF00><bold>Réussit: Offres placées</bold></font><BR />";
     
    }
    		}
     
    		}
    	}
    }
    ?>
     
     
    <?php
     
     
     
    </div>
     
    		<?php
    		include('includes/bas.htm');
    		//mysql_close();
    		?>

    bas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		<div id="footer">
    			Site réalisé par Rian.<br/>
    			<?php var_dump($_SESSION); 
    			echo session_id(); ?><br/>
    			<?php echo $queries; ?> requête(s).
    		</div>
    	</body>
    </html>

    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
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
     
    function sqlquery($requete, $number)
    {
    	$query = mysql_query($requete) or exit('Erreur SQL : '.mysql_error().' Ligne : '. __LINE__ .'.'); //requête
    	queries();
     
    	/*
    	Deux cas possibles ici :
    	Soit on sait qu'on a qu'une seule entrée qui sera
    	retournée par SQL, donc on met $number à 1
    	Soit on ne sait pas combien seront retournées,
    	on met alors $number à 2.
    	*/
     
    	if($number == 1)
    	{
    		$query1 = mysql_fetch_assoc($query);
    		mysql_free_result($query);
    		/*mysql_free_result($query) libère le contenu de $query, je
    		le fais par principe, mais c'est pas indispensable.*/
    		return $query1;
    	}
     
    	else if($number == 2)
    	{
    		while($query1 = mysql_fetch_assoc($query))
    		{
    			$query2[] = $query1;
    			/*On met $query1 qui est un array dans $query2 qui
    			est un array. Ca fait un array d'arrays :o*/
    		}
    		mysql_free_result($query);
    		return $query2;
    	}
     
    	else //Erreur
    	{
    		exit('Argument de sqlquery non renseigné ou incorrect.');
    	}
    }
     
    function queries($num = 1)
    {
    	global $queries;
    	$queries = $queries + intval($num);
    }
     
    function connexionbdd()
    {
    	//Définition des variables de connexion à la base de données
    	$bd_nom_serveur='localhost';
    	$bd_login='root';
    	$bd_mot_de_passe='';
    	$bd_nom_bd='bid';
     
    	//Connexion à la base de données
    	mysql_connect($bd_nom_serveur, $bd_login, $bd_mot_de_passe);
    	mysql_select_db($bd_nom_bd);
    	mysql_query("set names 'utf8'");
    }
     
    function actualiser_session()
    {
    	if(isset($_SESSION['membre_id']) && intval($_SESSION['membre_id']) != 0) //Vérification id
    	{
    		//utilisation de la fonction sqlquery, on sait qu'on aura qu'un résultat car l'id d'un membre est unique.
    		$retour = sqlquery("SELECT id, username, password, ticket FROM users WHERE id = ".intval($_SESSION['membre_id']), 1);
     
    		//Si la requête a un résultat (id est : si l'id existe dans la table membres)
    		if(isset($retour['username']) && $retour['username'] != '')
    		{
    			if($_SESSION['membre_mdp'] != $retour['password'])
    			{
    				//Dehors vilain pas beau !
    				$informations = Array(/*Mot de passe de session incorrect*/
    									true,
    									'Session invalide',
    									'Le mot de passe de votre session est incorrect, vous devez vous reconnecter.',
    									'',
    									'connexion.htm',
    									3
    									);
    				require_once('../information.htm');
    				vider_cookie();
    				die("lol1");
    				session_destroy();
    				exit();
    			}
     
    			else
    			{
    				//Validation de la session.
    					mysql_query("UPDATE users SET last_access=".time()." WHERE id=$retour[id]"); queries();
    					$_SESSION['membre_id'] = $retour['id'];
    					$_SESSION['membre_pseudo'] = $retour['username'];
    					$_SESSION['membre_mdp'] = $retour['password'];
    					$_SESSION['membre_ticket'] = $retour['ticket'];
    			}
    		}
    	}
     
    	else //On vérifie les cookies et sinon pas de session
    	{
    		if(isset($_COOKIE['membre_id']) && isset($_COOKIE['membre_mdp'])) //S'il en manque un, pas de session.
    		{
    			if(intval($_COOKIE['membre_id']) != 0)
    			{
    				//idem qu'avec les $_SESSION
    				$retour = sqlquery("SELECT id, username, password, ticket FROM users WHERE id = ".intval($_COOKIE['membre_id']), 1);
     
    				if(isset($retour['username']) && $retour['username'] != '')
    				{
    					if($_COOKIE['membre_mdp'] != $retour['password'])
    					{
    						//Dehors vilain tout moche !
    						$informations = Array(/*Mot de passe de cookie incorrect*/
    											true,
    											'Mot de passe cookie erroné',
    											'Le mot de passe conservé sur votre cookie est incorrect vous devez vous reconnecter.',
    											'',
    											'membres/connexion.htm',
    											3
    											);
    						require_once('../information.htm');
    						vider_cookie();
    				die("lol2");
    						session_destroy();
    						exit();
    					}
     
    					else
    					{
    						//Bienvenue :D						
    						mysql_query("UPDATE users SET last_access=".time()." WHERE id=$retour[id]"); queries();
    						$_SESSION['membre_id'] = $retour['id'];
    						$_SESSION['membre_pseudo'] = $retour['username'];
    						$_SESSION['membre_mdp'] = $retour['password'];
    						$_SESSION['membre_ticket'] = $retour['ticket'];
    					}
    				}
    			}
     
    			else //cookie invalide, erreur plus suppression des cookies.
    			{
    				$informations = Array(/*L'id de cookie est incorrect*/
    									true,
    									'Cookie invalide',
    									'Le cookie conservant votre id est corrompu, il va donc être détruit vous devez vous reconnecter.',
    									'',
    									'membres/connexion.htm',
    									3
    									);
    				require_once('../information.htm');
    				vider_cookie();
    				die("lol3");
    				session_destroy();
    				exit();
    			}
    		}
     
    		else
    		{
    			//Fonction de suppression de toutes les variables de cookie.
    			if(isset($_SESSION['membre_id'])) unset($_SESSION['membre_id']);
    			vider_cookie();
    		}
    	}
    }
     
    function vider_cookie()
    {
    	foreach($_COOKIE as $cle => $element)
    	{
    		setcookie($cle, '', time()-3600);
    	}
    }

    EDIT : Si je suis connecter, l'id de session ne change plus la :s Sinon, il change tous les 2 refresh

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    La cette fois il y a du code, mais pas qu'un peu

    Il n'y a pas moyen de dégrossir un peu le terrain ?
    Tu as rajouter des die() au moment des vider_cookie(), mais il serait bon d'en rajouter un peu partout, histoire de savoir qu'est ce qui est exécuté, et surtout si c'est correctement.
    Particulièrement dans cette fonction actualiser_session().

    Est ce que coté config tu affiche les erreurs de Php en cas d'erreur, ou as tu consulté des log d'erreurs ?
    Disons que s'il y a des erreurs, il serait bon ici de le savoir, et le voir.


    Le truc qui serait bon à savoir, c'est est ce que le problème a lieu uniquement dans cette page, ou est ce dans n'importe quelle page ?
    Puis tu as parlé de captcha, qui d'ailleurs peu très bien être la source du problème, et bien as tu essayé de désactiver, ou ne plus afficher le captcha, et voir si le problème persiste.

    En tout cas, si dès le début l'ID de session de session n'est pas la même que précédemment, il y a un réel problème.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre du Club
    Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2007
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2007
    Messages : 146
    Points : 48
    Points
    48
    Par défaut
    J'affiche les erreurs, toutes je sais pas.

    Sur index il n'y a pas le captcha. C'était juste un exemple.

    Puré merci j'avais pas prit le temps de faire un truc que je fais souvent, debugé avec les die.

    Ce qui plante ? c'est vider_cookie. Elle doit a mon avis me supprimer le cookie de la session ....

    C'est bien gênant d'ailleurs ^^

    Il faut juste prendre le reflexe, dès qu'on utilise plus une variable de session, la unset, comme par exemple les messages d'erreurs pour un formulaire d'inscription !



    Merci beaucoup, j'ai un soulagement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Afficher et archiver les durées des sessions
    Par Triton972 dans le forum Contribuez
    Réponses: 0
    Dernier message: 27/01/2012, 01h50
  2. Le problème de la durée des sessions sur le forum developpez.com
    Par Thomas_ats dans le forum Evolutions du club
    Réponses: 14
    Dernier message: 12/01/2009, 18h44
  3. Augmenter la durée des sessions
    Par fadex dans le forum Langage
    Réponses: 4
    Dernier message: 08/01/2009, 14h20
  4. Comment augmenter la durée des sessions?
    Par dolf13 dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2007, 17h38
  5. [JSF] Durée des sessions
    Par bslota dans le forum JSF
    Réponses: 1
    Dernier message: 18/01/2006, 10h04

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