Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/01/2011, 23h18   #1
Débutant
 
Inscription : novembre 2006
Messages : 1 036
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 1 036
Points : 166
Points : 166
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
deubelte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 09h30   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
Salut

En tout 1er, as tu bien pris en compte cette avertissement (bien plus visible sur le site officiel php.net) :
Citation:
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 :
Citation:
<?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 :
Citation:
<?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/
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2011, 11h42   #3
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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 :
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));
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h43.


 
 
 
 
Partenaires

Hébergement Web