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 :

question sur la fonction mysql_escape_string() [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut question sur la fonction mysql_escape_string()
    Bonjour

    J'ai une question sur la fonction mysql_escape_string(). Avant de poster, j'ai bien sur lu des tutoriels sur cette fonction, comme ici:

    http://php.net/manual/fr/function.my...ape-string.php

    Mais je n'arrive vraiment pas à savoir ce que cela fait. Ni a quoi ça sert.
    Il est écrit:
    La chaîne qui doit être échappée.

    Mais ça veut dire quoi une chaîne échappée? C'est quoi une chaîne non échappée?


    Merci

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    En tout 1er, as tu bien pris en compte cette avertissement (bien plus visible sur le site officiel php.net) :
    Cette fonction est OBSOLETE depuis PHP 5.3.0. Nous vous encourageons vivement à ne plus l'utiliser.
    Donc déjà, utilise mysql_real_escape_string()


    Selon le contexte, on a très souvent besoin d'échapper certains caractères pour éviter des conflits.
    Exemple simple en Php :
    <?php
    echo 'Bonjour l'angoisse ...';
    ?>
    Ceci va provoquer une erreur de syntaxe car j'ai utiliser des simples quote (ceci -> ' une apostrophe) comme délimiteur pour entourer la chaine du echo, mais la chaine elle même contient le même caractère de délimitation.
    Php va croire dans ce cas que la délimitation est : 'Bonjour l'
    Du coup, le reste de la chaine pose problème.

    Pour ça, on échappe la quote comme ceci et plus de problème :
    <?php
    echo 'Bonjour l\'angoisse ...';
    ?>
    On échappe avec un anti-slash -> \
    En faite, grâce à ce caractère spécifique, on indique explicitement que cette quote (au milieu) n'est pas un délimiteur, mais fait partie de la chaine.


    Tu rencontreras exactement le même problème pour les requêtes SQL (MySQL et autre) pour les chaines.
    Par précaution il vaut mieux systématiquement les échapper, cette fonction est faite pour ça.


    Après, vient un autre problème qui se rajoute : La sécurité.
    Si on échappe pas les données dans une chaine SQL, on prend le risque qu'un pirate plus malin que les autres parvienne à rajouter des instructions à ton insu à des fins plus ou moins malhonnêtes.

    Cette fonction mysql_real_escape_string() en fait donc un peu plus, c'est pour ça qu'il est largement recommandé de l'utiliser.


    A savoir qu'il y a PDO qui, si exploitée convenablement, on a plus besoin de le faire, PDO le fait automatiquement.
    Voir un tuto sur PDO : http://fmaz.developpez.com/tutoriels...omprendre-pdo/

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    A savoir qu'il y a PDO qui, si exploitée convenablement, on a plus besoin de le faire, PDO le fait automatiquement.
    Euh, ne faisons pas croire n'importe quoi aux lecteurs :

    Ce sont les requêtes préparées (sous réserve d'être correctement utilisées) qui font qu'on n'a plus rien à échapper. Mais elles ne sont en rien spécifiques à PDO : mysqli permet d'en tirer profit ainsi que sqlite3, pgsql, oci8, etc. C'est le client (pour la partie qui nous intéresse) qui les implémente, non PDO/PHP (à moins d'être émulées).

    Et PDO, comme les autres, permet aussi l'usage de requêtes non préparées, auquel cas il faut toujours échapper ses données soi-même (méthode quote pour PDO).

    Arrêtons l'amalgame absurde PDO = requêtes préparées = sécurité, malheureusement si courant.

    --

    HS : inutile, mais pour montrer les différents types d'échappement :
    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
    $dbh = new PDO('mysql:host=' . DBHOST . ';dbname=' . DBNAME, DBUSER, DBPASSWD);
     
    $dbh->exec('SET PROFILING = 1');
     
    $pattern = '~\[color=([\'"]?)([a-z]+|#[[:xdigit:]]{6})\1\](.+)\[/color\]~Usi';
    $replacement = '<span style="color: \2">\3</span>';
     
    $dbh->exec('INSERT IGNORE INTO motifs(pattern, replacement) VALUES(' . $dbh->quote($pattern) . ', ' . $dbh->quote($replacement) . ')');
    $insert1 = $dbh->prepare('INSERT IGNORE INTO motifs(pattern, replacement) VALUES(:pattern, :replacement)');
    $insert1->execute(array('pattern' => $pattern, 'replacement' => $replacement));
     
    $dbh->exec('SET PROFILING = 0');
    $dbh->exec('SET sql_mode = "NO_BACKSLASH_ESCAPES"');
    $dbh->exec('SET PROFILING = 1');
     
    $dbh->exec('INSERT IGNORE INTO motifs(pattern, replacement) VALUES(' . $dbh->quote($pattern) . ', ' . $dbh->quote($replacement) . ')');
    $insert1->execute(array('pattern' => $pattern, 'replacement' => $replacement));
     
    $dbh->exec('SET PROFILING = 0');
     
    $prof = $dbh->query('SHOW PROFILES');
    print_r($prof->fetchAll(PDO::FETCH_ASSOC));

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

Discussions similaires

  1. [Dates] Question sur les fonctions Date
    Par cerede2000 dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2006, 17h26
  2. Question sur la fonction recv
    Par Mr_Chut dans le forum Réseau
    Réponses: 14
    Dernier message: 15/09/2006, 12h43
  3. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47
  4. Réponses: 1
    Dernier message: 08/02/2006, 11h18
  5. Réponses: 2
    Dernier message: 21/12/2005, 09h39

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