95 votes

Que signifie l'échappement d'une chaîne de caractères ?

Je lisais Est-ce que $_SESSION['username'] doit être échappé avant d'entrer dans une requête SQL ? et il est dit "Vous devez échapper à chaque chaîne que vous passez à la requête sql, quelle que soit son origine". Maintenant, je sais que quelque chose comme ça est vraiment basique. Une recherche sur Google a donné plus de 20 000 résultats. Stackoverflow à lui seul avait 20 pages de résultats mais personne n'explique réellement ce qu'est l'échappement d'une chaîne ou comment le faire. On ne fait que supposer. Pouvez-vous m'aider ? Je veux apprendre parce que, comme toujours, je suis en train de créer une application Web en PHP.

J'ai regardé : Insertion de caractères d'échappement , Quels sont tous les caractères d'échappement en Java ? , Impossible d'échapper à une chaîne avec addcslashes() , Caractère d'échappement , Que fait réellement mysql_real_escape_string() ? , Comment puis-je échapper aux guillemets doubles d'une chaîne de caractères en php ? , MySQL_real_escape_string n'ajoute pas les barres obliques ? , supprimer les séquences d'échappement d'une chaîne de caractères en php Je pourrais continuer, mais je suis sûr que vous avez compris. Ce n'est pas de la paresse.

23voto

John Conde Points 102874

Certains caractères ont une signification particulière pour la base de données SQL que vous utilisez. Lorsque ces caractères sont utilisés dans une requête, ils peuvent provoquer un comportement inattendu et/ou involontaire, y compris permettre à un attaquant de compromettre votre base de données. Pour éviter que ces caractères n'affectent une requête de cette manière, ils doivent être échappés ou, pour le dire autrement, il faut demander à la base de données de ne pas les traiter comme des caractères spéciaux dans cette requête.

Dans le cas de mysql_real_escape_string() il s'échappe \x00 , \n , \r , \ , ' , " y \x1a car ceux-ci, s'ils ne sont pas échappés, peuvent causer les problèmes mentionnés précédemment, notamment des injections SQL dans une base de données MySQL.

2voto

supi Points 21

Pour simplifier, on peut imaginer que la barre oblique inversée "\" est une commande adressée à l'interpréteur pendant l'exécution.

Par exemple, en interprétant cette déclaration :

$txt = "Hello world!";

lors de la phase d'analyse lexicale (ou lors du découpage de l'énoncé en tokens individuels), ce sont les tokens qui sont identifiés $ , txt , = , " , Hello world! , " y ;

Cependant, la barre oblique inversée dans la chaîne de caractères provoque un ensemble supplémentaire de jetons et est interprétée comme une commande pour faire quelque chose avec le caractère qui la suit immédiatement : par exemple

$txt = "this \" is escaped";

donne lieu aux jetons suivants : $ , txt , = , " , this , \ , " , is escaped , " y ;

l'interpréteur sait déjà (ou a des itinéraires prédéfinis qu'il peut emprunter) ce qu'il doit faire en fonction du caractère qui succède à l'option \ symbolique. Ainsi, dans le cas de " il le traite comme un caractère et non comme une commande de fin de chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X