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_globals et session


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre éclairé Avatar de J0r_x
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2006
    Messages : 804
    Par défaut
    si tu remplaces if($id_selection === false) par if(!$id_selection)

  3. #3
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Sinon plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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']);
    }

  4. #4
    Membre éclairé Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    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!

  5. #5
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    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 ?

  6. #6
    Membre éclairé Avatar de remyli
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 270
    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

Discussions similaires

  1. [Sécurité] Crypte les sessions
    Par amazircool dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2006, 15h58
  2. [Sécurité] Problème de sessions avec IE6
    Par TheMoutch dans le forum Langage
    Réponses: 8
    Dernier message: 21/08/2006, 17h52
  3. [Sécurité] fermeture de session
    Par cyrill.gremaud dans le forum Langage
    Réponses: 16
    Dernier message: 26/06/2006, 09h58
  4. [Sécurité] Problème de session
    Par Sandara dans le forum Langage
    Réponses: 31
    Dernier message: 23/05/2006, 16h10
  5. [Sécurité] Créer une session sécurisée
    Par HwRZxLc4 dans le forum Langage
    Réponses: 6
    Dernier message: 16/05/2006, 22h19

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