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 16/01/2007, 15h11   #1
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
Par défaut [Sécurité] register_globals et session

[register_globals et session]

register_globals http://fr.php.net/manual/fr/security.globals.php

Salutations chers Développeurs.

J’ai rencontré un bug assai bizarre sur un site.
Mon code qui marchait très bien jusqu'à maintenant ne marche plus.

Mon code avant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//fichier ma_selection.php
 
#Démarrage de la session
session_start() ;
 
# Récupération de la sélection
$id_selection = false ;
 
if(isset($_SESSION['id_selection'])) {$id_selection = $_SESSION['id_selection'];}
if(isset($_GET['id_selection']))     {$id_selection = $_GET['id_selection'];}
if(isset($_POST['id_selection']))    {$id_selection = $_POST['id_selection'];}
 
if($id_selection === false)
{
	header ("location: mes_selections.php");
}
$_SESSION['id_selection'] = $id_selection ;
Explication :

Mon but est d’avoir un identifiant de sélection : $id_selection
Je crée donc la variable $id_selection et je lui donne une valeur par défaut : false

Ensuite je cherche une valeur pour ma variable.
D’abord dans la session, puis dans les paramètres GET et enfin dans POST.

Enfin je teste si ma variable est toujours égale (en type et en valeur ( = = = )) a false.
Si c’est le cas c’est que je n’ai pas d’identifiant de sélection disponible et donc je quitte cette page.
Sinon j’enregistre mon identifiant de sélection dans la session afin de pouvoir le récupérer au prochain appel à la page.


Le premier appel à la page ce fait ainsi :
ma_selection.php ?id_selection=666

L’identifiant est bien récupéré dans GET et enregistré en session.
Les autres appels n’ont plus besoin de préciser la sélection.


Ce code marché correctement sur le serveur avec register_globals = On et marche toujours en local.



Puis le problème suivant est apparut.

La création de la variable $id_selection = false ; est effectué correctement. Mais il n’est plus possible de le récupérer dans la session.
(La première affectation par GET marche Et $_SESSION['id_selection'] a bien sa valeur en début de script !!)
Comme si $id_selection refusait de changer de valeur !!

___________
J’ai dans un premier temps réglé le problème de la façon suivante

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//fichier ma_selection.php
 
#Démarrage de la session
session_start() ;
 
# Récupération de la sélection
//$id_selection = false ;
 
if(isset($_SESSION['id_selection'])) {$id_selection = $_SESSION['id_selection'];}
if(isset($_GET['id_selection']))     {$id_selection = $_GET['id_selection'];}
if(isset($_POST['id_selection']))    {$id_selection = $_POST['id_selection'];}
 
//if($id_selection === false)
if($id_selection == ‘’)
{
	header ("location: mes_selections.php");
}
$_SESSION['id_selection'] = $id_selection ;


J’ai discuté du problème avec mon administrateur serveur et il m’a orienté vers le register_globals
(Qui été à On sur le serveur et a Off chez moi, en local)

Et il se trouve que mettre register_globals = Off règle le problème.


Mais pourquoi ?
Il ne me semble pas que ma méthode de programmation initial ne soit pas compatible avec register_globals = On , Au contraire ! J’ai essayé de développer de tel façon que mon code soit réutilisable quelque soit la configuration de cette variable et de façon a éliminé tout comportement aléatoire du à une variable auto définit.


Si quelqu’un peut éclairer ma lanterne.

Merci d’avance et bon code @Tous.
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2007, 15h17   #2
Membre chevronné
 
Avatar de J0r_x
 
Homme
Analyste - Programmeur
Inscription : mai 2006
Messages : 712
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Analyste - Programmeur
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2006
Messages : 712
Points : 607
Points : 607
si tu remplaces if($id_selection === false) par if(!$id_selection)
J0r_x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2007, 15h30   #3
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Sinon plus simple...

Code :
1
2
3
4
5
6
7
 
session_start();
if (!isset($_SESSION['id_selection']) && !isset($_POST['id_selection']) && !isset($_GET['id_selection'])) {
	header('location:  mes_selections.php');
} else {
	$_SESSION['id_selection'] = ($_POST['id_selection']) ? $_POST['id_selection'] : $_GET['id_selection']);
}
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2007, 15h47   #4
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
Par défaut Merci @|PaRa-BoL && @J0r_x

@|PaRa-BoL
La question n'est pas dans la 'simplicité' (traduite ici par de l'économie de charactaire)
Mais dans le pb ça a marché, et pourquoi ça n'as plus marché.

Et pi je sais pas ... pour moi, (et peut être que moi) je trouve ma syntaxe plus lisible.




@J0r_x
if(!$id_selection)
Ne permet pas la comparaison de type.
Mon identifiant de selection pourait étre 0
Mais en pratique, je suis d'accord : ce ne sera jamais le cas!
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2007, 17h24   #5
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Lisible pour toi peut etre mais c'est pas très propre.

Sinon tu peux toujours essayer de debuguer avec des echo pour voir si les conditions sont bien remplis et peut être essayer avec empty() au lieu de isset().

Et aussi reparer les erreures de logiques...

Et aussi pourquoi initialise tu ta variable à false et ne verifis tu pas directement avec !isset() au lieu de verifier son intégrité initiale ?
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 09h41   #6
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
Par défaut Merci @ |PaRa-BoL

Citation:
Envoyé par |PaRa-BoL
Lisible pour toi peut être mais c'est pas très propre.
Question d'habitude. Enfin là n'est pas le problème.
Et pis le problème est résolut grace au changement de register_global

Citation:
Envoyé par |PaRa-BoL
Sinon tu peux toujours essayer de débuguer avec des echo pour voir si les conditions sont bien remplis et peut être essayer avec empty() au lieu de isset().
C'est grâce au écho que j'ai pu diagnostiquer un refus de changement de valeur (je vais mettre le code avec les echo)

Citation:
Envoyé par |PaRa-BoL
Et aussi réparer les erreurs de logiques...
S'il y en a je veux bien qu'on me les indique.... car, peut être, ma propre logique m'échappe.

Citation:
Envoyé par |PaRa-BoL
Et aussi pourquoi initialise tu ta variable à false et ne vérifies tu pas directement avec !isset() au lieu de vérifier son intégrité initiale ?
A l'origine je suis développeur C++ puis java.
J'ai donc hérité de certaines habitude qui même si elle ne sont pas indispensables en php ne sont 'normalement' pas nuisible (et plutôt bonnes selon moi).


------------------------
Mais c'est vrai que ce problème remet en cause toute ma vision de la chose
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2007, 09h50   #7
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
Par défaut le code avec les echo

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo "<br>_SESSION['id_selection'] = " . $_SESSION['id_selection']; //666
 
//selection 
$id_selection = false;
echo "<br>id_selection = " . $id_selection; // rien : c'est false
if(isset($_SESSION['id_selection'])) {$id_selection = $_SESSION['id_selection'];}
if(isset($_GET['id_selection']))     {$id_selection = $_GET['id_selection'];}
if(isset($_POST['id_selection']))    {$id_selection = $_POST['id_selection'];}
echo "<br>id_selection = " . $id_selection; // rien : c'est false
if($id_selection === false)
{
	header ("location: mes_selections.php");
	echo '<br>header ("location: mes_selections.php")<br>';
}
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 11h49   #8
Candidat au titre de Membre du Club
 
Inscription : novembre 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 31
Points : 12
Points : 12
Citation:
Envoyé par SoF_AzraeL
Question d'habitude. Enfin là n'est pas le problème.
Et pis le problème est résolut grace au changement de register_global


C'est grâce au écho que j'ai pu diagnostiquer un refus de changement de valeur (je vais mettre le code avec les echo)


S'il y en a je veux bien qu'on me les indique.... car, peut être, ma propre logique m'échappe.


A l'origine je suis développeur C++ puis java.
J'ai donc hérité de certaines habitude qui même si elle ne sont pas indispensables en php ne sont 'normalement' pas nuisible (et plutôt bonnes selon moi).


------------------------
Mais c'est vrai que ce problème remet en cause toute ma vision de la chose
Le seul truc que ceci peut t'apprendre c'est de faire en sorte de travailler avec un register_globals à OFF !

C'est hautement recommandé niveau sécurité et la plupart des hébergeurs se doivent de le mettre à OFF. En effet, si tu travailles de cette façon, tu peux contrôler tout ce qui rentre et sort de tes pages web.

Et même s'il est à ON cela fonctionnera à l'inverse de ta programmation qui compte sur le register globals ON!!

Juste un conseil que je te donne


bblampain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2007, 15h12   #9
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
Citation:
Envoyé par bblampain
l'inverse de ta programmation qui compte sur le register globals ON!!
Grrrrrrr
Mais je veux travailler avec register globals OFF !!!
Donc j'ai tout fait pour que ça marche avec register globals ON ou OFF !!
Et ce même si le serveur était sur ON ...
Et ça marchait bien !!!!!

Et pi un jour (comme ça sens rien ....) ça marche pu !!!!

POURQUOI !!!!!!
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2007, 16h06   #10
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Mais on te la déjà dit !!!!!

Va lire la doc PHP sur register_global et tu comprendras mieux... c'est quand meme pas compliqué, je t'ai même filé le code qui marche...
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2007, 16h23   #11
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
Salut, ton code avec les echo c'est avec les global à on ou off ?
parce que ca :

Code :
1
2
3
4
5
echo "<br>_SESSION['id_selection'] = " . $_SESSION['id_selection']; //666
 
//selection 
$id_selection = false; // ici tu écrases SESSION['id_selection']
echo "<br>id_selection = " . $id_selection; // rien : c'est false
Avec les global à on ca me paraît normal, mais off :/
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2007, 17h09   #12
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
ça veut dire que le fait de lire $_SESSION['id_selection'] créer un pointeur $id_selection vers $_SESSION['id_selection']
et que en faisant $id_selection = false; j'écrase $_SESSION['id_selection'] ?????





Je crois que j'ai plus qu'a tout oublier du php et tout réaprendre......
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2007, 17h17   #13
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
http://fr.php.net/manual/fr/security.globals.php
Citation:
Envoyé par php.net
Lorsque register_globals est activé, la logique ci-dessus peut être prise en défaut. Lorsque register_globals est désactivée $authorized ne peut plus être assignée via la requête, et le script est maintenant sûr, même s'il reste recommandé de toujours initialiser ses variables. Par exemple, dans notre programme ci-dessus, nous pourrions ajouter $authorized = false. En faisant cela, le script peut fonctionner avec register_globals on ou off, car les utilisateurs seront par défaut non-identifiés.
c'est bien ce que je fait :

j'initialise ma variable
ensuite je lui affecte une valeur en massurant de ça provenance
Code :
1
2
if(isset($_SESSION['id_selection'])) 
{$id_selection = $_SESSION['id_selection'];}
Si $id_selection est toujour == false c'est que je n'ais pas d'id_selection.
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 21h52   #14
Membre régulier
 
Inscription : janvier 2007
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 85
Points : 80
Points : 80
Peut être vais-je dire une grosse connerie, mais j'avais le même gende de problème que j'ai résolu en faisant un

voila mon code :
Code :
1
2
3
4
5
6
session_start();
if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) {
  extract($_POST);
  $var1=$login
  $var2=$pass
}
mais faut pas me demander pourquoi depuis que j'ai fait ça j'ai plus de problèmes.

@++
p.legal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 10h34   #15
Membre habitué
 
Avatar de remyli
 
Inscription : avril 2005
Messages : 272
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 272
Points : 113
Points : 113
En effet c'est bizzard
__________________
Orthographe => Message Privé constructif svp
remyli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 10h56   #16
Membre régulier
 
Inscription : janvier 2007
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 85
Points : 80
Points : 80
as tu essayé de faire un extract() sur tes variables globales de type POST et GET ?

ça donne quoi ?

@++
p.legal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 18h33   #17
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Citation:
Envoyé par p.legal
as tu essayé de faire un extract() sur tes variables globales de type POST et GET ?

ça donne quoi ?

@++
Faut arrêter de donner de mauvaise habitudes ><
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 19h10   #18
Membre régulier
 
Inscription : janvier 2007
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 85
Points : 80
Points : 80
Désolé, je voulais juste faire avancer le smilblick
à l'avenir, je m'abstiendrais ....

mais, autant que je me couche moins c.. ce soir, en quoi utiliser extract() est une mauvaise habitude ?

@++
p.legal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 19h49   #19
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
un $_POST est un $_POST et une variable normal est une variable normal, sinon autant mettre le register_global à on
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 20h23   #20
Membre régulier
 
Inscription : janvier 2007
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 85
Points : 80
Points : 80
Merci pour ta réponse :
est ce que tu essaye de me dire qu'il faut laisser la variable $_POST['lot'] telle qu'elle ?
et donc ce code :
Code :
1
2
3
4
5
if(isset($_POST) && !empty($_POST['lot'])) {
  	extract($_POST);
    $tmp = $lot;
    $lot=htmlspecialchars($tmp, ENT_QUOTES);
	}
devrait plutôt ressembler à ça :

Code :
1
2
3
if(isset($_POST) && !empty($_POST['lot'])) {
    $_POST['lot']=htmlspecialchars($_POST['lot'], ENT_QUOTES);
	}
Oui ???
p.legal 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 19h55.


 
 
 
 
Partenaires

Hébergement Web