1

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

<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 注入?谢谢你的帮助!

4

2 回答 2

3

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

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

鉴于 cfqueryparam 只能在 cfquery 标记内使用,cfscript 版本使参数化动态语句更容易一些。但是,只要您必须执行任意字符串,就真的没有万无一失的方法来保护查询免受 sql 注入。如果可能的话,我会建议重组以消除动态 SQL。鉴于它是一个遗留应用程序,我意识到它更具挑战性,但最终结果是值得的。

FWIW,请记住,虽然 sql 注入保护可能是使用 cfqueryparam 最关键的好处,但还有其他好处。最显着的是使用不同参数执行多次查询的性能改进。这实际上是绑定变量的主要目的。随之而来的注射保护只是一个很好的副作用。

于 2016-02-04T22:38:05.683 回答
1

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

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

于 2016-02-04T22:19:23.933 回答