麻烦使用cfqueryparam与SQL查询字符串

时间:2016-02-04 22:01:25

标签: sql coldfusion cfqueryparam

所以我有一个在不同文件中构造的字符串作为我需要绑定的全局变量(遗留代码)传递给查询:

<cfset queryString="((playerID=1223) OR playerID=1224))">

<cfquery name="testQuery">
    SELECT *
    FROM teamRoster
    WHERE teamID = 9876
    AND <cfqueryparam value="#queryString#" cfsqltype="CF_SQL_VARCHAR">
</cfquery>

有没有办法在这里使用cfqueryparam查询字符串?或者有没有不同的方法来保护自己免受sql注入?谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

(评论太长了......)

不,因为cfqueryparam(或绑定变量)旨在阻止您尝试执行的操作,即执行字符串作为sql命令。绑定变量不能用于必须被dbms解释为命令的任何内容,例如表或列名,运算符等 - 只有数字或简单字符串等文字。

鉴于cfqueryparam只能在cfquery标记中使用,cfscript version使参数化动态语句更容易一些。但是,只要您必须执行任意字符串,就会有no bullet proof way to protect the query against sql injection。如果可能的话,我建议重组以消除动态SQL。鉴于它是一个遗留应用程序,我意识到它更具挑战性,但最终结果是值得的。

FWIW,请记住,虽然sql注入保护可能是使用cfqueryparam的最重要的好处,但有other benefits as well。最值得注意的是,对于执行多次查询的性能改进,参数不同。这实际上是绑定变量的主要目的。注射保护带来的只是一个很好的副作用。

答案 1 :(得分:1)

您不能将cfqueryparam用于查询字符串。它只能用于sql允许你进行参数化的东西(基本上,只是像字符串或数字这样的文字)。它们不能绑定到关键字或字段名称,更不用说复杂的子句了。

FWIW,这是一个SQL限制,而不是ColdFusion问题。