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é] Mauvais transfert de variables entre scripts [Fait]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [Sécurité] Mauvais transfert de variables entre scripts
    Bonjour

    Mon hébergeur (Skynet) à modifié le fichier register_globals et nous force à travailler avec des variables de sessions. Ce qui est beaucoup mieux, j'en conviens.

    En 2003, j'avais développé un site (PHP3) et je transférais mes variables via l'URL. Ma page est construite dans un tableau construit avec des echo dans une boucle while. et tout marchait bien.

    Chaque ligne du tableau est construite de la même façon. et les liens donnent ceci

    Ma page de départ donne les liens suivants :

    http://www.clici.be/www/fam_voir.php?id=151
    http://www.clici.be/www/fam_voir.php?id=152
    http://www.clici.be/www/fam_voir.php?id=153
    http://www.clici.be/www/fam_voir.php?id=154

    Le problème est que ma page d'arrivée reçoit toujours la même variable id, > dans ce cas ci 154 qui est la dernière ligne de mon tableau.

    Or, on a beau voir que la variable id change dans l'url en bas du browser mais la variable transmise est toujours la dernière du tableau. Soit dans ce cas ci "154" .

    Je présume que j'écrase à chaque fois ma variable.

    Si j'ai bien compris, tous les scripts doivent démarrer par un "session_start"
    et on transmet ainsi les variables de script en script.

    Il y a donc un moyen d'intégrer la bonne variable dans la construction du lien a href ...

    il faut probablement insèrer "$_session['id'][] = $id" dans la contruction du lien <a href> ... ou alors je me trompe complètement.

    Ma question est donc, comment faire comprendre à PHP qu'il doit tenir compte de la bonne variable "id" ? Il y a autant de variables "id" que de lignes dans le tableau.

    Quelqu'un peut il m'aider ? Pouvez vous me donner un exemple ou h ref tiendrait compte de la bonne variable ?

    Merci beaucoup.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 333
    Points : 15 677
    Points
    15 677
    Par défaut
    la configuration de "register_globals" n'est pas directement lié aux sessions
    maintenant pour récupérer les informations fournies dans l'URL, tu devras passer par la tableau $_GET

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Voici des morceaux de mes scripts, ça peut aider

    Index.php :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php session_start(); 
    $_session['id']= 1;
    ?>
    ...
     
    //création du tableau ...
     
    while ($famille = mysql_fetch_array ($resultat))
    {
     
    	if($color=="#FFFF99") $color="#99FFCC"; ELSE $color="#FFFF99";
     
     
     
    	$id = $famille['famille_id']; // La variable qui change dans le tableau
     
    // Construction du tableau qui envoit vers fam_voir.php
     
    	echo "<TR BGCOLOR=".$color.">";
    	echo "<td>$affich</td>";
    	echo "<td>";
    	echo "<div align=\"center\"><a href=fam_voir.php?id=".$id.">V</a>";
    	echo "</td>";
    	echo "</tr>";
    }
    echo "</table>";
     
    ...
    fam_voir.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php session_start(); 
     
     
    if(isset($_SESSION["id"])) 
          echo 'La variable "id" existe et vaut: ' . $_SESSION["id"]; 
    else
    echo 'id n\'existe pas ...';
    ?>

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 333
    Points : 15 677
    Points
    15 677
    Par défaut
    dans le fichier "fam_voir.php" tu peux récupérer les valeurs passées par l'URL dans le tableau $_GET donc tu as la valeur que tu cherches dans $_GET['id']
    et pour ça tu n'as pas besoin des sessions

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Voilà, j'ai rajouté un

    $_GET['id'];

    mais hélas, rien n'y fait.

    sur fam_voir.php, id n'existe pas ... pourtant, elle est bien transmise dans l'url ...

    -- fam_voir.php

    <?php session_start();

    $_GET['id'];

    if(isset($_SESSION["id"]))
    echo 'La variable "id" existe et vaut: ' . $_SESSION["id"];
    else
    echo 'id n\'existe pas ...';
    ?>

    Quid alors ???

  6. #6
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut c'est normal
    Tu récupères avec $_GET et tu teste avec $_SESSION, fais:

    Et afin de faciliter la migration future avec PHP6 utilise $_GET et non $HTTP_GET_VARS car si register_globals sera supprimée avec PHP6, register_long_arrays le sera également.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Il y a un net progrès
    Merci à tous pour votre acharnement à nous aider tous. je sais que cela prend du temps car je fais aussi de la hotline ...

    En effet, cela fonctionne mieux avec le bonnes variables ... Mais la suite est sans doute aussi simple à résoudre mais il faut le savoir comment, je m'explique ...

    Ma fameuse variable id se transmet donc bien de script en script via la méthode de transfert par URL mais avec la methode post, cela ne fonctionne plus ... avant les modifs de mon FAI, j'avais pas de problèmes ...

    Je veux contrôler le mot de passe de "id" sur la page mot_passe_modif.php. Sur cette page, "id" est bien présent mais cette fois ci j'emploie la méthode post dans le script pour transférer la variable "id" vers la page controle_modif.php

    Et là, sur controle_modif, je perds la variable "id" ... snif !!!

    Voici mon petit code

    ---- mot_pass_modif.php
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <?php session_start(); 
     
    if(isset($_GET['id'])) 
          echo 'La variable "id" existe et vaut: ' . $_GET['id']; 
    else
          echo 'id n\'existe pas ...';
     
    $id = $_GET['id'];
     
    //print $id;
     
    ?> 
     
    <html>
    <head>
    <title>Document sans titre</title>
    </head>
     
    <body>
    <table width="100%" border="0">
      <tr> 
        <td><div align="center">Entrez votre mot de passe ...</div></td>
      </tr>
      <tr> 
        <td><form name="form1" method="post" action="controle_modif.php">
            <div align="center"> 
              <input type="password" name="passe">
              <input type= submit value = "Continuer">
              <input name="id" type="hidden" id="id" value="<?php echo $id ; ?>">
            </div>
          </form></td>
      </tr>
    </table>
    <p>&nbsp;</p>
    </body>
    </html>

    ---- controle_modif.php

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?php session_start(); 
     
    if(isset($_GET['id'])) 
          echo 'La variable "id" existe et vaut: ' . $_get["id"]; 
    else
    		echo 'id n\'existe pas ...';
     
     
    //print $id;
     
    //print ("variable = $passe<br>");
    //print ("id = $id<br>");
     
    // Controle pour modifications
    //trouver son mot de passe
     
    require_once("connexion.php");
     
    $sql = "SELECT motpasse FROM famille where famille_id = '$id'";
    $resultat = mysql_query ($sql);
    while ($ligne=mysql_fetch_array($resultat))
    {
    $var = $ligne["motpasse"]; // stocke le mot de passe en mémoire ($var)
    }
    //if (($compte==$compte2) :: ($nom=="fabrice")):
    //print($var);
    //print($passe);
     
    switch($passe)
     
    {
    case $var: // si la variable opération est égale à 1
    //print ' Ok'; // on affiche cette phrase
    $fichier = "fam_mod.php";
    $lien = "Votre mot de passe est ACCEPTE, cliquez sur ce lien pour continuer";
     
    break; // on referme cette condition 
     
    case 'admin':// si la variable opération est égale à 2
    //print 'admin'; 
    $fichier = "fam_mod.php";
    $lien = "Votre mot de passe est ACCEPTE, cliquez sur ce lien pour continuer";
     
    break; 
     
    default: // si la variable opération n'est pas égale à 1 ni à 2 ou si elle n'est pas définie
    //print 'defaut'; // on affiche une phrase par défaut
    $fichier = "index.php";
    $lien = "Votre mot de passe est REFUSE, cliquez sur ce lien pour revenir en arrière";
     
    } 
     
     
    ?>
      <tr> 
        <td><form name="form1" method="post" action="<?php echo $fichier ; ?>">
            <div align="center"> 
              <input name="id" type="hidden" id="id" value="<?php echo $id ; ?>">
              <input type= submit value = "<?php echo $lien ; ?>">
     
            </div>
          </form></td>
      </tr>
    Quid alors ?
    Pouvez vous m'aider à retrouver "id" ? ;-)

  8. #8
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 333
    Points : 15 677
    Points
    15 677
    Par défaut
    si tu envoies les données avec la méthode POST, tu trouveras tes données dans le tableau $_POST

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Super, merci pour le coup de main.
    Voilà, mon site est à nouveau sur pied.

    Un grand merci à tous. Excusez moi si mes questions ont l'air débiles. Parce qu'en effet, les réponses sont tellement logiques.

    Ceci dit, après cette remise à niveau, je ne vois pas l'utilité de session_start(), dumoins dans mon cas, c'est vrai que cela fonctionne aussi sans ...

    Certainement une question de sécurité.

    Je crois qu'elle a son utilité si on ne veut pas mélanger les variables des différentes sessions. MAis alors, toutes les variables doivent être transférées via $_session[] ?

    Ai je bien compris ?

    Un grand bravo pour le site ET pour son suivi, ça fait du bien de voir qu'on s'intéresse aussi aux nuls comme moi ... et quelle rapidité de réaction. Bravo à toute l'équipe !!!

  10. #10
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 333
    Points : 15 677
    Points
    15 677
    Par défaut
    la fonction "session_start" sert uniquement à mettre en place la session et à rendre disponible le tableau $_SESSION

    regarde là pour des explications sur les sessions :
    http://php.developpez.com/cours/sessions/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de transfert de variable entre Flash et PHP
    Par megartaud dans le forum Intégration
    Réponses: 3
    Dernier message: 06/04/2008, 01h25
  2. Passage de variables entre scripts
    Par zabdaniel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 21/02/2008, 11h12
  3. Transfert de variables entre 2 sessions
    Par Lenezir dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2007, 15h34
  4. Réponses: 8
    Dernier message: 19/07/2007, 10h50
  5. Passage de variable entre scripts.
    Par Ambrym dans le forum Langage
    Réponses: 3
    Dernier message: 24/08/2006, 20h10

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