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 31/03/2006, 10h19   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 14
Points : 10
Points : 10
Par défaut [Sécurité] Problème de récupération d'objet sérialisé

Bonjour
J'ai fait des recherches sur le forum, et j'ai lu pas mal de posts, mais je n'ai pas trouvé de cas similaire au mien ( j'espère que je n'ai pas mal cherché)

Je suis en train de réaliser un site en PHP5. Il y a une partie nécessitant une identification. Lorsque la personne a saisi son login et son mot de passe, je crée un objet utilisateur (qui me permet par la suite, de vérifier que la personne à les droits d'accès, et de voir si la session est toujours active).
L'objet utilisateur est sérialisé, puis stocké dans une variable de session. La personne est ensuite redirigée vers une page d'accueil.
Sur cette page, je récupère l'objet utilisateur de cette façon :
Code :
1
2
 
$utilisateur = unserialize($_SESSION["utilisateur"]);
En local, le site fonctionne très bien, mais lorsque je le mets en ligne, j'ai une erreur sur la page d'accueil de la personne connectée :
Code :
Warning: __clone method called on non-object in /home/e/esorisis/www/sdmb/index_intranet.php5 on line 14
suivie d'une belle fatal error :

Code :
Fatal error: Call to a member function estActif() on a non-object in /home/e/esorisis/www/sdmb/index_intranet.php5 on line 16
qui est logique, puisque ma fonction estActif() s'applique à mon objet $utilisateur...

Voilà le code de ma page id.php (qui vérifie le login et le mot de passe, puis crée l'objet et le met dans la variable de session) :

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
 
<?php
 
//On démarre une session
session_start();
 
include ("../include/fonctions.php");
include_once("../classes/utilisateur.class.php");
include_once("../classes/mysqlConnexion.class.php");
 
//On se connecte à la base de données
$cx = mysqlConnexion::getInstance();
 
//On récupère le login et le mot de passe saisi.
$login = $_POST["login"];
$mdp = $_POST["md5"];
$nom_page = $_GET["page"];
//Création et exécution de la requête
$query = "SELECT login FROM membres WHERE login = '$login' ";
$result = $cx->requete($query);
$num = $cx->nbrLignes($result);
 
//On vérifie que le nom d'utilisateur entré existe dans la base de données.
if ($num == 1) //Le nom d'utilisateur a été trouvé.
{
 $query2 = "SELECT id_membre, login, niveau FROM membres
			WHERE login = '$login'
			AND mdp = '$mdp'";
 $result2 = $cx->requete($query2);
 $num2 = $cx->nbrLignes($result2);
 
 if ($num2 == 1) //Le mot de passe est correct ainsi que le nom d'utilisateur
 {	
 	  $ligne = $cx->recupLigne($result2);
	  $utilisateur = new utilisateur($ligne["id_membre"], $ligne["login"], $_SERVER['REMOTE_ADDR'], $ligne["niveau"]);
	  $_SESSION["utilisateur"] = serialize($utilisateur);
 	  redirection("../index_intranet.php");	  
 }
 
 else //Mot de passe incorrect
 {
 redirection("../identification.php?erreur=1");
 }
}
 
elseif ($num == 0) //Le nom d'utilisateur est incorrect
{
 redirection("../identification.php?erreur=2"); 
}
 
 
?>
Voici le code de la page d'accueil de la personne identifiée (index_intranet.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
75
76
77
78
79
80
81
82
83
 
<?php
	//On démarre la session
	session_start();
	//On inclue le fichier de fonctions qui contient la fonction __autoload()
	include ("include/fonctions.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>MASTER Stratégies de Découverte de Molécules Bioactives</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	   <link rel="stylesheet" media="screen" type="text/css" title="Design SDMB" href="style/style.css" />
   </head>
   <body>
   <div id="entete">
   <img src="images/accueil.gif" title="Accueil" alt="Maison" /><a href="index.php" title="Accueil du site"> Accueil</a> - 
<?php   
	//Si la personne est identifiée
	if (isset($_SESSION["utilisateur"])) {
		//On récupère l'objet contenu dans la variable de session
		$utilisateur = unserialize($_SESSION["utilisateur"]);
		//Si la session est toujours active (timeout pas dépassé, et même adresse IP)
		if ($utilisateur->estActif()) {
?>
   <img src="images/main.gif" title="Intranet" alt="Main" /><a href="index_intranet.php" title="Accueil de l'Intranet"> Intranet</a> - 
<?php   		
		}
	}
	else {
?>
   <img src="images/main.gif" title="Intranet" alt="Main" /><a href="identification.php" title="Accueil de l'Intranet"> Intranet</a> - 
<?php		
		}
?>
   <img src="images/pieds.gif" title="Plan du site" alt="Pieds" /><a href="modele.php" title="Consulter le plan du site"> Plan du site</a> - 
   <img src="images/mail.gif" title="Webmaster" alt="Mail" /><a href="modele.php" title="Contacter le webmaster"> Webmaster</a> &nbsp;&nbsp;
   </div>
 
<?php
//Si la personne n'est pas identifiée, elle est redirigée
if (!isset($_SESSION["utilisateur"])) {
		redirection("index.php");
	}	
?>
 
   <div id="conteneur">
 
   <?php    
   //Si la personne est connectée :
	if (isset($_SESSION["utilisateur"])) {
		//Si la connexion est active (même IP et timeout pas dépassé)
		if ($utilisateur->estActif()) {
   			include ("include/menu_intranet.php");
		}
		//La session n'est plus valide, on redirige l'utilisateur.
		else {
			redirection("index.php");
		}			
	}
   ?>
 
   <div id="corps">
   	<div id="contenu">
 
	   <h1>Intranet</h1>
 
	   <p>
	   Bienvenue dans l'espace Intranet du MASTER <strong>Sratégies de Découverte de Molécules Bioactives</strong> !
	   Depuis cet espace, vous pouvez consulter votre messagerie, les éventuels changement d'emploi du temps, l'annuaire
	   des étudiants et des professeurs ainsi que les cours mis en ligne.
	   </p>
	   <p>
	   Pour des raisons de sécurité, pensez à vous déconnecter du site avant de partir :o)
	   </p>
 
 
	</div>
   </div>
 
   </div>
   </body>
</html>
Bon en vous recopiant ce code, je me rends compte que je fais pas mal de tests inutile (je teste plein de fois si la personne est identifiée), mais le problème n'est pas là à mon avis.

Si quelqu'un a une idée, sur l'origine de mon erreur ça me sauverait la vie, parce que comme c'est mon premier site en php5, je ne vois pas vraiment l'erreur sûrement bête que j'ai faite
Mysticlolly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 10h24   #2
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
as-tu essayé d'afficher l'objet de session "utilisateur" avec print_r ?
__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 10h45   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 14
Points : 10
Points : 10
Je viens de tester le print_r et la chaine de mon objet s'affiche. En fait je viens de résoudre en partie mon problème :
Je me suis rendue compte que je récupérais 2 fois l'objet dans une même page... Donc après correction, je peux enfin m'identifier et accéder à la page d'accueil des utilisateurs connectés.
Seul petit bémol, mais je pense que ça doit être facilement rectifiable :
Si je tente d'accéder à une autre page protégée (comme la page d'administration) et que je fais un print_r, cette fois, rien ne s'affiche, ce qui voudrait dire que ma variable de session n'est pas conservée?
Est ce que je dois réenregistrer l'objet à chaque fois, alors que je ne le modifie pas?
Mysticlolly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 11h21   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 14
Points : 10
Points : 10
J'ai continué à faire des tests, pour voir d'où ça pourrait venir, mais je ne trouve pas
Sur les autres pages, la variable de sessions $_SESSION["utilisateur"] existe bien, seulement, il semblerait qu'elle ne contienne rien, puisque le print_r n'affiche rien...
Une idée? s'il vous plaît
Mysticlolly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 11h28   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 14
Points : 10
Points : 10
Bon le print_r affiche bien quelque chose, mais je l'avais mal placé.
Sur la page où j'ai un problème, voilà ce que m'affiche le print_r :
Code :
1
2
 
PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => utilisateur [id_membre:private] => 1 [login:private] => Mysticlolly [ip:private] => 194.214.161.77 [niveau:private] => 20 [dernier_acces:private] => 1143797210 )
Mysticlolly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 13h50   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2005
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 14
Points : 10
Points : 10
Bon ben j'ai trouvé mon erreur comme une grande
Je vous dis d'où ça venait, au cas où quelqu'un fasse un jour la même bêtise que moi :

En fait c'est tout simple, lorsque je créais ma session, j'appelais ma variable de session $_SESSION['utilisateur'], et quand je la récupérais par la suite je faisais un $utilisateur = unserialize ($_SESSION['utilisateur'];
La grosse bêtise venait de là, puisque pour PHP $utilisateur et $_SESSION['utilisateur'] ben c'est la même variable !
Du coup, il m'a suffit d'appeler ma variable $_SESSION['user'] pour résoudre mon problème

Bon ben voilà, je vous l'ai dit, c'était bête, mais fallait trouver quand même mdr

Allez hop : RESOLU
Mysticlolly est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 14h16   #7
Membre Expert
 
Avatar de ska_root
 
Homme
Développeur informatique
Inscription : août 2005
Messages : 1 179
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : août 2005
Messages : 1 179
Points : 1 580
Points : 1 580
content pour toi...

l'erreur était simple, mais pas évidente (je l'ai moi-même déjà eu d'ailleurs de mémoire...) et elle mériterait d'être notée dans la FAQ

bon dév

__________________
http://cdemarche.developpez.com/

Tu as la réponse à ta question ? N'oublies pas le petit en bas à gauche de ton message...
ska_root est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h07.


 
 
 
 
Partenaires

Hébergement Web