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

PHP & Base de données Discussion :

Remplacer mysql_real_escape_string par une requête préparée [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut Remplacer mysql_real_escape_string par une requête préparée
    Bonjour à tous,

    Je suis en train de commencer à utiliser PDO pour la création de mes sites.

    Avant d'utiliser PDO je faisait un contrôle de login et password de la manière suivante.

    Dans la page à laquelle est envoyé la paire à tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(isset($_POST['login'])){
    if($_POST['login']!="")$login=htmlentities($_POST['login'],ENT_QUOTES);else $login="xx";
    if($_POST['psswd']!="")$psswd=mysql_real_escape_string($_POST['psswd']);else $psswd="xx";
    $utils->secuVAD($login,$psswd);
    }
    Et dans la classe qui faisait le contrôle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public function secuVAD($login,$psswd){
    session_start();
    $query_rsPass ="SELECT count(*) as nbrs FROM perso WHERE login='".$login."' AND psswd='".$psswd."'";
     
    $rsPass=@mysql_query($query_rsPass, $this->BDD);
    $row_rsPass = mysql_fetch_assoc($rsPass);
    if($row_rsPass['nbrs']==1){
    session_regenerate_id();
    $_SESSION['nomUtil']=$login;
    @mysql_free_result($rsPass);
    } else {
    echo '<script>window.location.replace("index.php");</script>';
    };
    }
    J'ai donc vu que je devais remplacer mysql_real_escape_string par une requête préparée pour utiliser PDO, mais j'ai besoin d'un peu d'aide pour construire cette requête car je suis un peu perdu

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Bonjour à tous,

    @sabotage : Merci pour le lien

    J'ai donc remplacé ma fonction par celle-ci :

    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
    public function secuVAD($login,$psswd){
    session_start();
    $query_rsPass ="SELECT COUNT(*) as nbrs FROM perso WHERE login=:login AND psswd=:psswd";
     
    $prep=$this->BDD->prepare($query_rsPass);
    $prep->execute(array(':login'=>$login, ':psswd'=>$psswd));
    $row_rsPass = $prep->fetch(PDO::FETCH_ASSOC);
     
    if($row_rsPass['nbrs']==1){
    session_regenerate_id();
    $_SESSION['nomUtil']=$login;
    } else {
    echo '<script>window.location.replace("index.php");</script>';
    };
    $prep=NULL;
    }
    Et ça fonctionne sans problème.

    Quelqu'un peut-il me dire si cette ligne de code est toujours utile dans la page qui reçoit les données à tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($_POST['login']!="")$login=htmlentities($_POST['login'],ENT_QUOTES);else $login="xx";
    Ou si elle peut être remplacée par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($_POST['login']!="")$login=$_POST['login'];else $login="xx";
    Merci d'avance pour vos réponses.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    En fait ça n'a jamais été utile ; avec l'extension mysql, il faut protéger les chaines avec mysql_real_escape_string().

    Avec PDO, on ne protège plus les chaines.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Merci de ta réponse,

    Donc maintenant je suis tranquille

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Juste pour être précis, on ne protège plus tant qu'on passe les variables en paramètre d'une requête préparée.

    Si tu concatènes tes variables comme on faisait avant, le problème de sécurité est toujours la.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Oui j'ai bien compris, si je veux protéger mes variables je les passe dans une requête préparée.

    Merci encore

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

Discussions similaires

  1. Remplacer une procédure stockée par une requête live
    Par antoniofr dans le forum Requêtes
    Réponses: 0
    Dernier message: 05/12/2008, 15h58
  2. Réponses: 2
    Dernier message: 10/02/2006, 14h46
  3. [SQL] Valeur retournée par une requête...
    Par Empty_body dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/01/2006, 22h13
  4. colonne définie par une requête imbriquée
    Par lper dans le forum Langage SQL
    Réponses: 10
    Dernier message: 02/09/2005, 16h41
  5. Récuparation des années par une requête
    Par 973thom dans le forum Access
    Réponses: 3
    Dernier message: 14/06/2005, 18h33

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