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 :

[Sécurité] Problème de récupération d'objet sérialisé [FAQ]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
     
    <?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 : 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
     
    <?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

  2. #2
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    as-tu essayé d'afficher l'objet de session "utilisateur" avec print_r ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    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?

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    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

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 )

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    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

  7. #7
    Membre chevronné
    Avatar de ska_root
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    1 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 1 203
    Points : 1 839
    Points
    1 839
    Par défaut
    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


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

Discussions similaires

  1. Problème à la récupération des objets associés
    Par LinC49 dans le forum Doctrine2
    Réponses: 15
    Dernier message: 10/12/2012, 19h23
  2. problème de récupération d'une liste d'objet au niveau des DAO
    Par yness dans le forum Persistance des données
    Réponses: 1
    Dernier message: 25/04/2011, 19h57
  3. [1.x] Problème de récupération d'objet action AJAX
    Par Jo Dalton dans le forum Symfony
    Réponses: 7
    Dernier message: 30/09/2010, 10h05
  4. Réponses: 0
    Dernier message: 27/03/2008, 00h18
  5. [hibernate]Problème de récupération d'objet...
    Par roxx62 dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/07/2005, 11h36

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