今天到客户那里演示项目,谁知道,一条正确能够执行的SQL,竟然一直都报错,查了半天,发现实际发到数据库去查询的SQL里面,所有的单引号’都给自动替换为两个单引号”了,因为这个SQL是由前台直接发到后台执行的,但是直接在<CFQuery/>中硬编码,同样的SQL语句却能够执行,真TNND郁闷,演示代码如下:

[xml]
<cfset sql="select * from someTable where char_col='test'"/>
<cfquery name="testQuery" datasource="someDs">
#sql#
</cfquery>

上面的代码执行时,实际提交给数据库的SQL是这样的:

select * from someTable where char_col=''test''

但是如果直接在<CfQuery/>中直接编码SQL,却一切正常:

[xml]
<cfquery name="testQuery" datasource="someDs">
select * from someTable where char_col='test'
</cfquery>

因为我用的是Coldfusion 8,就以为是Coldfusion 8 的BUG,可想想又不对,如果这是BUG,怎么这么常用功能的如此严重的BUG会出现在Coldfusion 8的发行版本中呢?

Coldfusion论坛一问,才知道原来这是Coldfusion的一个放置SQL注入的安全措施,当<CFQuery/>中整个SQL是由变量传入时,所有的’就会自动替换为”,来实现SQL注入的避免,其实这个问题,在<CFQuery/>的手册里面有提到其中有个安全措施要注意,可我一直都没看,所有才有了今天的恶果,痛苦。。。。

当然如果在确保您的SQL中不会有注入的风险,可以保证安全的情况下,只要用PreserveSingleQuotes()函数封装您的SQL语句,就可以避免单引号被替换的问题了:

[xml]
<cfset sql="select * from someTable where char_col='test'"/>
<cfquery name="testQuery" datasource="someDs">
	#PreserveSingleQuotes(sql)#
</cfquery>

兄弟们,有问题时,多看手册,可别象我这样傻不拉唧的还以为是BUG呢,敢情Coldfusion项目组那都是傻瓜!真TNND郁闷!