10
votes

Comment puis-je échapper à des citations simples et doubles dans une déclaration préparée SQL?

J'ai une instruction SQL similaire à celle indiquée ci-dessous dans Perl: xxx

Le $ A est un texte libre qui peut contenir tout ce qui peut contenir des guillemets simples, des guillemets doubles, de l'arrière-plan. Personnages Slash, etc.

Comment ces personnages peuvent-ils être échappés pour que l'instruction SQL fonctionne?

Merci.


2 commentaires

$ A et $ B avoir une signification particulière liée à la fonction de tri . Ce n'est généralement pas une bonne idée de les utiliser. Sauf comme court nom de variable dans un échantillon de code.


Autre que la balise [Perl], dup de meilleur moyen d'arrêter l'injection SQL dans PHP . La seule différence pratique réside dans les échantillons de code. En outre, dup de Quel est le meilleur moyen d'éviter les attaques d'injection SQL? .


4 Réponses :


22
votes

Vous pouvez utiliser la méthode -> ciote code> (en supposant que vous utilisez dibi): xxx pré>

mieux encore, la meilleure pratique consiste à utiliser des valeurs liées : P>

my $sth = $dbh->prepare("DBName..ProcName ?,? ");
$sth->execute($a, $b);


3 commentaires

Je suis désolé de ne pas être clair. Je fais un appel à une procédure stockée. L'exemple aurait dû être quelque chose comme ci-dessous: mon $ SQL = "dbname..procname '$ a', '$ b'";


L'utilisation des paramètres de liaison doit toujours fonctionner pour les appels de procédure stockés.


Et au cas où il n'est pas évident, si vous utilisez des paramètres de liaison et que vous avez échappé manuellement des guillemets simples sur vos valeurs avant d'exécuter l'insertion, la valeur de la colonne se retrouvera avec deux guillemets simples séquentiels pour chaque devis.



9
votes

Utilisez une déclaration préparée. Remplacer la variable avec A?. Pour bercer un exemple de Mangages DBI:

$sql = 'SELECT * FROM people WHERE lastname = ?';
$sth = $dbh->prepare($sql);
$sth->execute($user_input_here);


1 commentaires

Je suis désolé de ne pas être clair. Je fais un appel à une procédure stockée. L'exemple aurait dû être quelque chose comme ci-dessous: mon $ SQL = "dbname..procname '$ a', '$ b'";



6
votes

Si vous utilisez des paramètres de requête, vous n'avez pas à échapper au contenu des chaînes.

my $sql="DBName..ProcName ?, ?";
$sth = $dbh->prepare($sql);
$sth->execute($a, $b);


0 commentaires

3
votes

Si vous ne voulez pas utiliser -> Citation (pour une raison quelconque (pour une raison quelconque, cette fonction ne fonctionne pas sur ma version de DBI), essayez ceci:

$query=~s/\"/\\\"/g;


0 commentaires