Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/04/2007, 10h53   #1
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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 :
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 :
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 :
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 :
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 :
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 :
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
Ravaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2007, 14h04   #2
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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.
Ravaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2007, 15h09   #3
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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
Ravaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 23h15   #4
Invité de passage
 
Inscription : avril 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 5
Points : 3
Points : 3
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.
tomcoch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2007, 00h27   #5
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
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!
Ravaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/05/2007, 14h22   #6
Futur Membre du Club
 
Inscription : mai 2006
Messages : 61
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 61
Points : 15
Points : 15
Par défaut Alors...

J'ai essayé avec un REPLACE et la syntaxe suivante:

Code :
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...
Ravaka est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h57.


 
 
 
 
Partenaires

Hébergement Web