2008-11-05 5 views
11

Je codage dans ColdFusion, mais en essayant de rester dans cfscript, j'ai donc une fonction qui me permet de passer dans une requête pour l'exécuter avec <cfquery blah > #query# </cfquery>ColdFusion ajoutant des guillemets supplémentaires lors de la construction des requêtes de base de données dans les chaînes

D'une certaine façon Cependant, lorsque je construis mes requêtes avec sql = "SELECT * FROM a WHERE b='#c#'" et que je les transmets, ColdFusion a remplacé les guillemets simples par 2 guillemets simples. il devient WHERE b=''c'' dans la requête finale.

J'ai essayé de créer des chaînes de différentes manières, mais je ne peux pas obtenir une seule citation. Même faire une chaîne de remplacement n'a aucun effet.

Une idée de pourquoi cela se passe-t-il? Il ruine mes espoirs de vivre dans cfscript pendant la durée de ce projet

Répondre

17

ColdFusion, par sa conception, échappe à des guillemets simples lors de l'interpolation de variables au sein de <cfquery> étiquettes.

Pour faire ce que vous voulez, vous devez utiliser la fonction PreserveSingleQuotes(). Ceci ne résout cependant pas le danger d'une injection SQL à laquelle vous vous exposez. L'utilisation de <cfqueryparam> permet également à votre base de données de mettre en cache la requête, ce qui, dans la plupart des cas, améliorera les performances.

Il peut être utile de lire an old Ben Forta column et a recent post by Brad Wood pour plus d'informations sur les avantages de l'utilisation de <cfqueryparam>.

4

ColdFusion échappe automatiquement apostrophes guillemets dans <cfquery> balises lorsque vous utilisez la syntaxe suivante:

SELECT * FROM TABLE WHERE Foo='#Foo#' 

Si vous voulez conserver les guillemets simples dans #Foo# vous devez appeler #PreserveSingleQuotes(Foo)#. Sachez que l'échappement automatique ne fonctionne que pour les valeurs variables et non pour les résultats de fonction.

SELECT * FROM TABLE WHERE Foo='#LCase(Foo)#' /* Single quotes are retained! */ 

Dans cette optique, la fonction PreserveSingleQuotes() (voir Adobe LiveDocs) n'est pas beaucoup plus qu'une « opération nulle » sur la valeur - en le transformant en un résultat de la fonction de by-pass automatique s'échapper.

6

La réponse à votre question, comme d'autres l'ont dit, utilise preserveSingleQuotes(...)

Cependant, la solution que vous voulez vraiment, est pas de construire dynamiquement vos requêtes de cette façon. C'est Bad Bad Bad.

Mettez votre SQL dans les balises CFQUERY, avec tout ifs/commutateurs/etc, le cas échéant, et assurer toutes variables FC utilisent la balise cfqueryparam.

(Remarque, si vous utilisez des variables dans la clause ORDER BY, vous devrez échapper manuellement toutes les variables, cfqueryparam ne peut pas être utilisé dans les clauses ORDER BY)

0

J'ai voté jusqu'à la réponse de Dave depuis que je pensais il a fait du bon travail.

Je voudrais ajouter cependant qu'il existe également plusieurs outils différents conçus pour ColdFusion qui peuvent simplifier un grand nombre de tâches SQL courantes que vous êtes susceptible d'effectuer. Il ya un outil très léger appelé DataMgr écrit par Steve Bryant, ainsi que Transfer de Mark Mandel, Reactor qui a été initialement créé par Doug Hughes et un que j'ai développé appelé DataFaucet. Chacun d'eux a ses propres forces et faiblesses. Personnellement, je pense que vous pouvez considérer que DataFaucet est celui qui vous donnera la meilleure capacité de rester dans cfscript, avec une variété de syntaxes pour la construction de différents types de requêtes.

Voici quelques exemples:

qry = datasource.select_avg_price_as_avgprice_from_products(); //(requires CF8) 

qry = datasource.select("avg(price) as avgprice","products"); 

qry = datasource.getSelect("avg(price) as avgprice","products").filter("categoryid",url.categoryid).execute(); 

qry = datasource.getSelect(table="products",orderby="productname").filter("categoryid",url.categoryid).execute(); 


Le cadre assure que cfqueryparam est toujours utilisé avec ces instructions de filtre pour empêcher les attaques d'injection sql, et il y a des syntaxes similaires pour insérer, mettre à jour et supprimer des déclarations . (Il y a un couple de simple rules to avoid sql-injection.)

Questions connexes