Position actuelle: Accueil> Derniers articles> Comment restaurer les données de session à l'aide de la fonction non sérialisée en PHP? Exemple d'explication

Comment restaurer les données de session à l'aide de la fonction non sérialisée en PHP? Exemple d'explication

gitbox 2025-09-30

1. Comment fonctionne la session

La session PHP enregistre les données utilisateur sur le serveur en utilisant un ID de session unique. Chaque fois qu'un utilisateur fait une demande, PHP recherchera l'ID de session et chargera les données de session correspondantes. Les données sont généralement accessibles via la variable hyperglobale $ _Session .

PHP utilise automatiquement la fonction Serialize en interne pour convertir des données telles que des objets ou des tableaux en stockage de chaînes, et les restaure en type de données d'origine à l'aide de la fonction non sérialisée .

Cependant, nous voulons parfois accéder directement à ces données sérialisées ou les traiter manuellement, et la fonction non sérialisée devient particulièrement importante.


2. Aperçu de la fonction non sérialisée

La fonction non sérialisée est utilisée pour convertir les chaînes sérialisées en variables PHP.

 <span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-title function_ invoke__">unserialize</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span> [, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$options</span></span><span> = [] ] )
</span></span>

Description du paramètre:

  • $ data : la chaîne à désérialiser.

  • $ Options : paramètre facultatif qui fournit un contrôle de désérialisation supplémentaire (support PHP 7+). Par exemple, une classe qui permet la désérialisation peut être spécifiée.

Valeur de retour:

  • Renvoie la variable désérialisée lors du succès et renvoie False en cas d'échec.


3. Exemple: sérialiser et désérialiser manuellement les données de session

Étape 1: Simuler le stockage de données de session

Supposons que nous ayons un objet utilisateur qui contient certaines informations utilisateur de base. Nous allons manuellement sérialiser l'objet et le stockerons dans la session.

 <span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();

</span><span><span class="hljs-comment">// Créer un objet utilisateur</span></span><span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">User</span></span><span> {
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$name</span></span><span>;
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-variable">$email</span></span><span>;

    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$name</span></span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>) {
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;name = </span><span><span class="hljs-variable">$name</span></span><span>;
        </span><span><span class="hljs-variable language_">$this</span></span><span>-&gt;email = </span><span><span class="hljs-variable">$email</span></span><span>;
    }
}

</span><span><span class="hljs-comment">// Instancier des objets utilisateur</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">User</span></span><span>(</span><span><span class="hljs-string">'John Doe'</span></span><span>, </span><span><span class="hljs-string">'[email protected]'</span></span><span>);

</span><span><span class="hljs-comment">// Sérialiser l&#39;objet utilisateur et l&#39;enregistrer session</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">serialize</span></span><span>(</span><span><span class="hljs-variable">$user</span></span><span>);
</span></span>

Dans le code ci-dessus, nous créons une classe d'utilisateurs et sérialisons un objet utilisateur John Doe et le stockons dans $ _SESSION ['user_data'] .

Étape 2: Restaurer (désérialiser) les données de session

Une fois les données stockées dans la session, nous pouvons les récupérer dans les demandes suivantes. Grâce à la fonction non sérialisée , nous pouvons restaurer les données sérialisées stockées dans la session au formulaire d'objet d'origine.

 <span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();

</span><span><span class="hljs-comment">// examiner session Y a-t-il 'user_data' données</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>])) {
    </span><span><span class="hljs-comment">// Désérialisation session données</span></span><span>
    </span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-title function_ invoke__">unserialize</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>]);

    </span><span><span class="hljs-comment">// Informations sur l&#39;utilisateur de sortie</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Name: '</span></span><span> . </span><span><span class="hljs-variable">$user</span></span><span>-&gt;name . </span><span><span class="hljs-string">'&lt;br&gt;'</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Email: '</span></span><span> . </span><span><span class="hljs-variable">$user</span></span><span>-&gt;email . </span><span><span class="hljs-string">'&lt;br&gt;'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'No user data found in session.'</span></span><span>;
}
</span></span>

Dans ce code, nous vérifions d'abord si $ _Session ['user_data'] existe. S'il existe, nous utilisons la fonction non désérialisée pour la restaurer dans l'objet utilisateur , puis sur les propriétés de cet objet.


4. Notes sur l'utilisation de la fonction non sérialisée

Problèmes de sécurité

Lorsque vous utilisez la fonction non sérialisée , une attention particulière doit être accordée aux problèmes de sécurité. Surtout lorsque vous désérialisation des données provenant de sources non fiables, cela peut entraîner des attaques d'injection d'objets. Cela pourrait permettre à un attaquant d'effectuer des opérations dangereuses en construisant des données sérialisées malveillantes. Par conséquent, il est recommandé d'ajouter des mesures de sécurité pour éviter de tels problèmes lors de l'utilisation de non-série .

Dans PHP 7+, les classes désérialisées peuvent être limitées en définissant l'option autorisée_classes . Par exemple, la restriction ne peut désérialiser que les classes d'utilisateurs :

 <span><span><span class="hljs-variable">$options</span></span><span> = [</span><span><span class="hljs-string">'allowed_classes'</span></span><span> =&gt; [</span><span><span class="hljs-string">'User'</span></span><span>]];
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-title function_ invoke__">unserialize</span></span><span>(</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_data'</span></span><span>], </span><span><span class="hljs-variable">$options</span></span><span>);
</span></span>

De cette façon, seuls les objets de la classe utilisateur peuvent être désérialisés, tandis que d'autres classes seront bloquées.

Problèmes de compatibilité pendant la désérialisation

Un non-série peut rencontrer des problèmes de compatibilité dans les environnements PHP transversales ou inter-serveurs. Par exemple, si une classe change dans une version différente, la désérialisation peut échouer. Pour éviter ce problème, les développeurs peuvent utiliser json_encode et json_decode comme alternatives, en particulier lorsque de simples structures de données sont impliquées.