Échapper une chaîne signifie réduire l'ambiguïté dans les guillemets (et autres caractères) utilisés dans cette chaîne. Par exemple, lorsque vous définissez une chaîne, vous l'entourez généralement de guillemets doubles ou de guillemets simples :
"Hello World."
Mais que se passe-t-il si ma chaîne contient des guillemets ?
"Hello "World.""
Maintenant, j'ai une ambiguïté - l'interprète ne sait pas où se termine ma chaîne. Si je veux garder mes guillemets doubles, j'ai quelques options. Je pourrais utiliser des guillemets simples autour de ma chaîne :
'Hello "World."'
Ou je peux échapper mes guillemets :
"Hello \"World.\""
Tout guillemet précédé d'une barre oblique est échappé , et compris comme faisant partie de la valeur de la chaîne.
En ce qui concerne les requêtes, MySQL surveille certains mots-clés que nous ne pouvons pas utiliser dans nos requêtes sans causer de confusion. Supposons que nous disposions d'un tableau de valeurs dans lequel une colonne s'appelle "Sélectionner", et que nous souhaitions la sélectionner :
SELECT select FROM myTable
Nous avons maintenant introduit une certaine ambiguïté dans notre requête. Dans notre requête, nous pouvons réduire cette ambiguïté en utilisant des back-ticks :
SELECT `select` FROM myTable
Cela supprime la confusion que nous avons introduite en utilisant un manque de jugement dans la sélection des noms de champs.
Une grande partie de cela peut être gérée pour vous en passant simplement vos valeurs via mysql_real_escape_string()
. Dans l'exemple ci-dessous, vous pouvez voir que nous transmettons les données soumises par l'utilisateur via cette fonction pour nous assurer qu'elles ne causeront aucun problème pour notre requête :
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
D'autres méthodes existent pour échapper les chaînes, telles que add_slashes
, addcslashes
, quotemeta
, et plus encore, même si vous constaterez que lorsque l'objectif est d'exécuter une requête sécurisée, les développeurs préfèrent généralement mysql_real_escape_string
ou pg_escape_string
(dans le contexte de PostgreSQL.