Comment puis-je échapper les guillemets simples et doubles dans SQL de la requête préparée?
J'ai une instruction SQL similaire à celui illustré ci-dessous en Perl:
my $sql="abc..TableName '$a','$b' ";
$Est un texte libre qui peut contenir n'importe quoi, y compris des apostrophes, guillemets, de dos et de l'avant-caractères barre oblique, etc.
Comment ces caractères doivent être échappés de faire de l'instruction SQL de travail?
Grâce.
$a
et $b
ont une signification particulière liée à la sort
fonction. Il n'est généralement pas une bonne idée de les utiliser. Sauf que court noms de variables dans un exemple de code.[Perl] balise, dup de Meilleur moyen d'arrêter l'Injection SQL dans PHP. La seule différence réside dans les exemples de code. Aussi, dup de Quel est le meilleur moyen d'éviter les attaques par injection SQL?.
OriginalL'auteur Sam | 2010-01-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez soit utiliser le
->quote
méthode (en supposant que vous êtes en utilisant DBI):Mieux encore, la meilleure pratique consiste à utiliser les valeurs de liaison:
Cela devrait également fonctionner pour les appels de procédures stockées, en supposant que la déclaration une fois que les cordes ont pris de l'extension SQL valide. Cela peut être conducteur/DB, de sorte que YMMV.
À l'aide de lier des paramètres doivent encore travailler pour des appels de procédures stockées.
Et dans le cas où il n'est pas évident, si vous avez été à l'aide de lier des paramètres ET vous avez été manuellement échapper les guillemets simples sur vos valeurs avant l'exécution de l'insérer, puis la valeur de la colonne va se retrouver avec deux séquentielle des guillemets simples pour tous les citer.
OriginalL'auteur mopoke
Utilisation d'une requête préparée. Remplacer la variable par un ?. Au lit de bébé un exemple de DBI manpages:
D'interpolation de saisie de l'utilisateur dans votre SQL demande pour des trous de sécurité.
OriginalL'auteur fennec
Si vous utilisez le paramètre de requête espaces réservés, vous n'avez pas à ignorer le contenu des chaînes.
Si le DBI est à l'aide de véritables paramètres de la requête, il envoie les valeurs de paramètre pour le SGBDR séparément de l'instruction SQL. Les valeurs ne sont jamais combiné avec l'instruction SQL de la chaîne, donc les valeurs n'ont jamais l'occasion de provoquer une injection SQL.
Si le DBI est "l'émulation" préparées par interpolation des variables dans la chaîne de requête, puis DBI doit gérer la bonne échapper à la logique de sorte que vous n'avez pas à. Laissez les experts (ceux qui écrivent et test DBI) vous soucier de comment le faire.
OriginalL'auteur Bill Karwin
Si vous ne souhaitez pas utiliser ->quote (pour quelque raison, cette fonction ne fonctionne pas sur ma version de DBI) ensuite, essayez ceci:
J'ai tendance à faire de même avec les guillemets simples et les virgules trop juste pour être sûr.
Semble bien fonctionner pour moi...!
OriginalL'auteur Chris Denman