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 21/06/2006, 11h53   #1
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Par défaut [Sécurité] register global à on et sécurité

Bonjour,

Sur mon mutualisé, register global est à on, je ne peux pas le modifier.
J'ai donc bien lu que je dois initialiser mes variables.
Par exemple si je reçois une variable $variable par l'url, je dois l'utiliser dans mon script sous la form $_GET['variable'] et surtout pas $variable.

Déjà là j'ai pas bien compris en quoi le fait de l'utiliser de la première manière et pas de la seconde constitue une sécurité même si je sais que le but est d'éviter que le pirate ne se crée des variables à sa guise.

Ensuite je voudrais savoir, si je dois faire htmlspecialchars(mysq_real_escape_string($_GET['variable'])) même si je n'utilise pas la variable dans une requête et qu'elle ne me sert que pour une condition if().

Merci pour vos explications sur ce point, c'est un peu obscur.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 12h15   #2
Membre éprouvé
 
Inscription : février 2005
Messages : 401
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : février 2005
Messages : 401
Points : 450
Points : 450
Un court exemple vaut mieux qu'un long discours :

Code :
1
2
3
4
5
 
if($login == true)  // Login est censé venir de la session
{
  Blablabla
}
Pour "pirater" ça, tu n'as qu'à passer une variable login par l'url et le tour est joué.

Alors que si c'est spécifié que "login" vient de la session, tu évites ce genre d'injection :

Code :
1
2
3
4
5
 
if($_SESSION['login'] == true)  // Login est censé venir de la session
{
  Blablabla
}
Sylvain71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 12h18   #3
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Salut,
pour le premier point, ca peut poser un problème si, par exemple, tu te sers d'une variable de session pour stocker des infos relatives à un utilisateur pour des pages protégées. Mettons que tu stockes son niveau de droits en session, il pourra modifier cette variable dans l'url, en faisant par exemple : site.com?droits=1

Pour le deuxième, à la base c'est pour protéger des injections SQL pour pas que l'utilisateur puisse modifier ta requête. Vu que l'utilisateur peut pas modifier ton code source PHP même en entrant n'importe quoi, je vois aucune raison d'utiliser escape_string() pour des tests sur des variables.
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 12h51   #4
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon vu comme ça j'ai l'impression de n'avoir pas fait de grosse boulette.
Prenons un exemple réel, je copie colle un bout de script que j'utilise :
//si il y a eu un avertissement, on affiche le message.
Code :
1
2
3
4
5
6
7
 
if(isset($avertissement) AND isset($_SESSION['pseudoSession']))
{
echo"
$avertissement
"
;}
Ici, $avertissement est créé dans la page, $_SESSION['pseudoSession'] est comme son nom l'indique une variable de session. Donc comme ça a priori c'est bon, pas besoin de filtres mysql_real ou autre si j'ai bien compris.

Ce que je pige pas c'est que si je fais ma condition avec $_POST['variable_du_formulaire'], le pirate peut pas me pirater en se créant une variable maison alors qu'il le peut si je fais juste $variable_du_formulaire.
Pourquoi ? ça tiens pas à grand chose mais j'ai pas compris le détail subtil et nuancé qui se cache derrière tout ça.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 13h43   #5
Membre éprouvé
 
Inscription : février 2005
Messages : 401
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : février 2005
Messages : 401
Points : 450
Points : 450
Citation:
Ce que je pige pas c'est que si je fais ma condition avec $_POST['variable_du_formulaire'], le pirate peut pas me pirater en se créant une variable maison alors qu'il le peut si je fais juste $variable_du_formulaire.
Heuuuu ... désolé je vois pas vraiment comment je peux faire plus clair que l'exemple que je t'ai donné :/
Qu'est ce que tu ne comprends pas au juste ? A quel moment qqchose t'échappe ?
Sylvain71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 14h35   #6
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
ca depend si register global est actif ou pas.

EDIT : explication plus bas !!
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 14h53   #7
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon ok, alors je reprend Sylvain71

Citation:
Alors que si c'est spécifié que "login" vient de la session, tu évites ce genre d'injection :
Justement, pourquoi si c'est spécifié, on évites ce genre d'injection ? Parce que le serveur ne va pas chercher la variable dans le même répertoire (je dis sans doute un truc c.. mais pour le moment je n'ai jamais administré de serveur) ?

Et c'est pareil que ce soit $_GET[], $_POST[] ou $_SESSION[] ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 15h00   #8
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
lis ca, si tu veux :
http://www.php.net/manual/fr/ini.cor...gister-globals

en fait si register global est à ON, c'est un gros probleme pour la sécurité.
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 16h13   #9
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Ok, j'ai lu, et cette page aussi
http://www.php.net/manual/fr/security.globals.php

C'est pas d'une clarté limpide mais ils sont clairs sur un point : toujours initialisé ses variables.

Alors je vais poser la question qui tue :

Je reçois via l'url la variable $url.
Je l'utilise directement dans mon script sous la forme $_GET['url'].
Idem pour les variables de session ou celles POST[] des formulaires.
En faisant cela, sont-elles initialisée ?

Ou dois-je faire un truc grotesque du genre, en haut de la page:
$_GET['url']=$_GET['url'].

Je voudrais pas me faire entuber à cause d'un détail de ce genre.
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 16h49   #10
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
bon j'ai dit une connerie, et faut bien que je réctifie tout ça, mais ca m'a foutu les boules ces failles de sécurité alors j'ai tout revérifié.

si register_global = 1
et que je rentre ?toto=LOL dans l'url, on a :
Code :
1
2
3
4
$toto:LOL
$_SESSION[toto]:
$_GET[toto]:LOL
$_POST[toto]:
et par contre si il est à 0, on a bien :
Citation:
$toto:
$_SESSION[toto]:
$_GET[toto]:LOL
$_POST[toto]:
donc il faut pas utiliser des variables $toto dans son code si on les initialise pas et tout ca.

mais si on a register_global à 0, y a pas de probleme, et nos variables de sessions ou autre ne pourront pas être piratées.
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 16h59   #11
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Et bien justement, quand tu dis :
Citation:
donc il faut pas utiliser des variables $toto dans son code si on les initialise pas et tout ca.
ça veut dire quoi les "initialiser" ? Indiquer leur provenance, c'est tout ?
Si elles viennent de la session les utiliser dans le script en précisant:
$_SESSION[bob]
Si elles viennent du formulaire, indiquer :
$_POST[bob]
Si elles viennent de l'url, indiquer :
$_GET[bob]


si elles sont créées dans le script de toute façon on craint rien normalement.

C'est cela qu'on appele "initialiser une variable" ? C'est simplement indiquer sa provenance ?
__________________
C'est pas parce que j'ai tort que vous avez raison.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 17h21   #12
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
on va dire que register_global est à 1.

donc si tu utilises des variables pour la session, il faut bien mettre SESSION devant, et la meme chose pour POST et GET !!
car et oui ca marche quand meme si c'est à 1, mais c'est pas du tout sécuritaire !!

oki ??

bon apres cela, imagine ce code :
Code :
1
2
3
4
if ( $_POST[titi] != "")
{
	$tata = "tata";
}
tu te dis, bah $tata apres je fais un teste dessus et suivant ce qu'il vaut, bah je fais quelque chose.

bah la si y a rien dans le POST, $tata n'a rien dedans, mais si tu rajoutes dans l'url ?tata=LOL et ben $tata = LOL dans ta page.
ce qui peut poser des problemes.

apres si tu code propre avec initialisation ca donnerait :
Code :
1
2
3
4
5
6
7
8
if ( $_POST[titi] != "")
{
	$tata = "tata";
}
else
{
       $tata = "";
}
et du coup tu es sur qu'au moins une fois ta variables à été initialisée dans ton script par quelque chose que TU as décidé !!
et comme le passage dans l'url arrive avant le début de ton script, les fausses valeurs dans l'url ne seront pas prises en comptes.
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 18h50   #13
Membre confirmé
 
Avatar de ShinJava
 
Inscription : septembre 2004
Messages : 411
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 411
Points : 287
Points : 287
Bonjour tout le monde,
Je commence à comprendre les failles qu'il peut y avoir avec le register global à "on". Merci maxoo pour ton dernier exemple.

Par contre, je ne comprend pas ce que veut dire Djakisback :

Citation:
Mettons que tu stockes son niveau de droits en session, il pourra modifier cette variable dans l'url, en faisant par exemple : site.com?droits=1
Du coup j'ai fais un petit test rapide avec un register global à "on" :

SESSION.php
Code :
1
2
3
4
<?php
session_start();
$_SESSION['droit'] = 2;
?>
SESSION2.php
Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
session_start();
if ($_SESSION['droit'] == 1) 
{
   echo "OUCH !";
} 
else 
{
	echo $_SESSION['droit'];
}
?>
Alors tout d'abord je fais www.monsite.com/SESSION.php pour initialiser ma variable session droit.
Ensuite je fais : www.monsite.com/SESSION2.php?droit=1
Ca me retourne la bonne valeur de SESSION['droit'] et non "OUCH !".

Alors, pourquoi à plusieurs reprises, il a était dit que les variables $_SESSION sont plus sensibles en mode register global "on"? Dans quel cas ?


Merci d'avance

++
ShinJava
__________________
Petit débutant deviendra grand... débutant
ShinJava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 19h32   #14
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
Citation:
Alors, pourquoi à plusieurs reprises, il a était dit que les variables $_SESSION sont plus sensibles en mode register global "on"? Dans quel cas ?
c'était faux, et j'ai corrigé

Citation:
Envoyé par Maxoo
bon j'ai dit une connerie, et faut bien que je réctifie tout ça, mais ca m'a foutu les boules ces failles de sécurité alors j'ai tout revérifié.
en fait ce sont juste des variables $normales qui sont sensibles au injection par l'url.
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 20h54   #15
Membre confirmé
 
Avatar de ShinJava
 
Inscription : septembre 2004
Messages : 411
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 411
Points : 287
Points : 287
Ouf ca me rassure, j'avais pas lu la relecture.
En fait, j'ai suivi la discussion post par post et celui de Djakisback m'a beaucoup troublé, donc j'ai commencé à paniquer de mon côté.

En tout cas merci pour les infos que tu as données et les 2 dernières démonstration qui expliquent bien la chose.

Donc du coup, il n'y aucun souci au niveau des $_SESSION quand la variable register global est à "on".

Me voilà rassuré
Bonne soirée.

++
ShinJava
__________________
Petit débutant deviendra grand... débutant
ShinJava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 21h25   #16
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Ah ou en effet je me suis un peu égaré ^^
Mais ca dépend du param variables_order qui définit l'ordre d'écrasement des variables et vu que par défaut, les variables de session sont en dernier, même si t'as les registers à on, tu peux pas en écraser une par un GET ou POST. Désolé pour l'erreur
Djakisback 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 04h16.


 
 
 
 
Partenaires

Hébergement Web