在构buildstring中的数据库查询时,ColdFusion会添加额外的引号
我在ColdFusion编码,但试图留在cfscript,所以我有一个函数,允许我通过查询运行它与<cfquery blah > #query# </cfquery>
不知何故,当我用sql = "SELECT * FROM a WHERE b='#c#'"
构build查询并将其传入时,ColdFusion用2个单引号replace了单引号。 所以它在最后的查询中变成WHERE b=''c''
。
我已经尝试了很多不同的方式来创buildstring,但我不能让它只留下一个报价。 即使做一个stringreplace也没有效果。
任何想法为什么发生这种情况? 在这个项目期间,破坏我在cfscript中生活的希望
根据devise,ColdFusion在<cfquery>
标签内插入variables时会转义单引号。
要做你想做的,你需要使用PreserveSingleQuotes()
函数。
<cfquery ...>#PreserveSingleQuotes(query)#</cfquery>
然而,这并没有解决你正在暴露自己的SQL注入的危险。
使用<cfqueryparam>
还允许数据库caching查询,这在大多数情况下会提高性能。
阅读Ben Fort Forta的一篇文章和Brad Wood最近发表的一篇文章 ,可能会有所帮助,详细了解使用<cfqueryparam>
的好处。
正如其他人所说,你的问题的答案是使用preserveSingleQuotes(...)
但是,您真正需要的解决scheme 不是以这种方式dynamic构build您的查询。 坏坏坏。
把你的SQL放到cfquery标签里面,根据需要用ifs / switches / etc,确保所有的 CFvariables都使用cfqueryparam
标签。
(注意,如果在ORDER BY子句中使用variables,则需要手动转义任何variables; cfqueryparam不能在ORDER BY子句中使用)
使用以下语法时,ColdFusion会自动转义<cfquery>
标记中的单引号引号:
SELECT * FROM TABLE WHERE Foo='#Foo#'
如果你想保留#Foo#
单引号,你必须调用#PreserveSingleQuotes(Foo)#
。
请注意,自动转义工作仅适用于variables值,不适用于函数结果。
SELECT * FROM TABLE WHERE Foo='#LCase(Foo)#' /* Single quotes are retained! */
有鉴于此,函数PreserveSingleQuotes()
(请参阅Adobe LiveDocs )不过是对值的“空操作” – 将其转换为函数结果以绕过自动转义。
因为我认为他做得很好,所以我把Dave的答案投给了他。
不过,我想补充一点,也有几种为ColdFusiondevise的工具,可以简化很多您可能执行的常见SQL任务。 史蒂夫·布莱恩特(Steve Bryant)写的DataMgr非常轻量级的工具,以及由Doug Hughes最初创build的反应器 Mark Mandel的转移工具,以及我开发的名为DataFaucet的工具 。 这些都有自己的长处和短处。 就我个人而言,我认为你可以考虑DataFaucet是一个能够让你留在cfscript中的最好的能力,用各种语法来构build不同types的查询。
这里有几个例子:
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();
该框架确保cfqueryparam始终与这些filter语句一起使用,以防止sql注入攻击,并且插入,更新和删除语句也有类似的语法。 (有几个简单的规则来避免sql注入 。)