2009-10-26 3 views
1

Donc je fais de la maintenance sur un site PHP qui utilise des variables $_SESSION. J'ai commencé à voir un comportement très très bizarre et après des heures de débogage je me suis juste rendu compte de cela. À titre d'exemple, disons que j'ai une séance configuration variables comme ceci:PHP Session Raccourcis de variable?

$_SESSION['user']['id'] = 123; 
$_SESSION['user']['firstname'] = 'John'; 
$_SESSION['user']['lastname'] = 'Doe'; 

À un moment donné dans un script, un appel à une table MySQL est faite en utilisant certaines classes Zend:

$sql = "SELECT whatever FROM table"; 
$user = $db->fetchRow($sql); 

maintenant voici où l'étrangeté commence ... Après cet appel de base de données est faite, ma valeur de tableau $_SESSION['user'] est tout à coup changé pour être l'objet qui est récupéré de l'appel de base de données ...

Fondamentalement: $_SESSION['user'] est maintenant le même que l'objet qui a été récupéré ed en utilisant la méthode DB fetchRow supposée être stockée dans la variable $user. Je n'ai jamais vu ça auparavant. La seule chose que je peux comprendre est que le nom de la variable $user est le même que le nom de la clé du tableau $_SESSION['user'], il agit comme un raccourci ou quelque chose comme ça.

Est-ce une sorte de raccourcis de session PHP étranges dont je n'ai jamais entendu parler auparavant? Sur une note de côté, je sais que l'accès direct $_SESSION n'est pas la meilleure pratique. Je n'ai pas construit ce site web. Mon travail consiste simplement à réparer certaines choses et à ajouter quelques fonctionnalités.

MISE À JOUR: Effectivement, register_globals est activé. Merci pour l'aide rapide les gars. Pas étonnant que je voyais un comportement aussi bizarre.

Répondre

6

On dirait que vous avez register_globals sur On dans PHP.ini. L'éteindre devrait corriger cela.

Si vous n'avez pas accès à modifier PHP.ini, une solution alternative est discutée here

4

Vérifiez si register globals est activé. L'accès $_SESSION est le seul moyen d'accéder aux données de session en toute sécurité.

Les globals de registre sont une ancienne fonctionnalité qui a transformé des variables globales en variables locales. Le problème était que vous ne pouviez pas savoir d'où provenaient les données. Quelque chose que vous attendiez d'une session peut être défini avec une variable get, post ou cookie. Il était donc très facile de contourner la sécurité.