将 cfqueryparam 与 sql 查询字符串一起使用时出现问题

Trouble using cfqueryparam with sql query strings

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

<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 注射?感谢您的帮助!

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

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

(评论太长了...)

不,因为 cfqueryparam(或绑定变量)旨在防止您正在尝试做的事情,即执行字符串 作为 sql 命令 .绑定变量不能用于必须由 dbms 解释为命令的任何内容,例如 table 或列名、运算符等 - 只能用于数字或简单字符串等文字。

鉴于 cfqueryparam 只能在 cfquery 标签内使用,cfscript version makes it a bit easier to parameterize dynamic statements. However, as long as you must execute arbitrary strings, there is really no bullet proof way to protect the query against sql injection。如果可能的话,我建议重组以消除动态 SQL。鉴于它是一个遗留应用程序,我意识到它更具挑战性,但最终结果是值得的。

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