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é] register global à on et sécurité


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    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.

  2. #2
    Membre chevronné
    Inscrit en
    Février 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2005
    Messages : 419
    Par défaut
    Un court exemple vaut mieux qu'un long discours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if($_SESSION['login'] == true)  // Login est censé venir de la session
    {
      Blablabla
    }

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    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.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre chevronné
    Inscrit en
    Février 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2005
    Messages : 419
    Par défaut
    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 ?

  6. #6
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 127
    Par défaut
    ca depend si register global est actif ou pas.

    EDIT : explication plus bas !!

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Bon ok, alors je reprend Sylvain71

    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[] ?

  8. #8
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 127
    Par défaut
    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é.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    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.

  10. #10
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 127
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $toto:LOL
    $_SESSION[toto]:
    $_GET[toto]:LOL
    $_POST[toto]:
    et par contre si il est à 0, on a bien :
    $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.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Et bien justement, quand tu dis :
    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 ?

  12. #12
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 127
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  13. #13
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    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 :

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    session_start();
    $_SESSION['droit'] = 2;
    ?>
    SESSION2.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  14. #14
    Membre Expert

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 127
    Par défaut
    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.

  15. #15
    Membre éclairé Avatar de ShinJava
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 413
    Par défaut
    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

  16. #16
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    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

Discussions similaires

  1. Register globals (php) et apache
    Par JoN28fr dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2006, 19h41
  2. [Tableaux] Register global off et GET
    Par vodasan dans le forum Langage
    Réponses: 4
    Dernier message: 31/07/2006, 17h08
  3. [POO] [register-globals] Problème de variable
    Par Neuromancien2 dans le forum Langage
    Réponses: 13
    Dernier message: 06/07/2006, 11h57
  4. [Directives] Hébergeur mutualisé avec register globals sur OFF
    Par max.onyx dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 25/04/2006, 17h22
  5. Réponses: 4
    Dernier message: 13/12/2005, 10h19

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