ColdFusion在字符串中构造数据库查询时添加额外的引号

11 sql string coldfusion railo cfml

我在ColdFusion中编码,但是试图留在cfscript中,所以我有一个函数允许我传入一个查询来运行它 <cfquery blah > #query# </cfquery>

但不知何故,当我构建查询sql = "SELECT * FROM a WHERE b='#c#'" 并将其传入时,ColdFusion已将单引号替换为2个单引号.所以它变成 WHERE b=''c''了最后的查询.

我尝试过很多不同的方法创建字符串,但我不能只留下一个引用.即使进行字符串替换也没有效果.

知道为什么会这样吗?在这个项目期间,它破坏了我在cfscript中生活的希望

ale*_*ale 18

根据设计,ColdFusion在<cfquery>标记内插变量时会转义单引号.

要做你想做的事,你需要使用这个PreserveSingleQuotes()功能.

<cfquery ...>#PreserveSingleQuotes(query)#</cfquery>
Run Code Online (Sandbox Code Playgroud)

但是,这并没有解决您自己暴露的SQL注入的危险.

使用<cfqueryparam>还允许您的数据库缓存查询,这在大多数情况下将提高性能.

阅读旧的Ben Forta专栏以及Brad Wood最近发布的有关使用益处的更多信息可能会有所帮助<cfqueryparam>.


Pet*_*ton 6

正如其他人所说,你的问题的答案正在使用 preserveSingleQuotes(...)

但是,您实际需要的解决方案不是以这种方式动态构建查询.这是坏坏.

将SQL放在cfquery标记内,并根据需要使用任何ifs/switch/etc,并确保所有 CF变量都使用该cfqueryparam标记.

(注意,如果在ORDER BY子句中使用变量,则需要手动转义任何变量;不能在ORDER BY子句中使用cfqueryparam)