所以我有一个在不同文件中构造的字符串,作为我需要绑定的全局变量传递到查询中(遗留代码(:
<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 命令的形式执行字符串。绑定变量不能用于必须由 dbms 解释为命令的任何内容,例如表或列名、运算符等 - 只能用于数字或简单字符串等文字。
鉴于 cfqueryparam 只能在 cfquery 标签中使用,cfscript 版本使参数化动态语句变得更加容易。但是,只要必须执行任意字符串,就真的没有防弹的方法可以保护查询免受SQL注入的影响。如果可能的话,我建议重组以消除动态SQL。鉴于它是一个遗留应用程序,我意识到它更具挑战性,但最终结果是值得的。
FWIW,请记住,虽然SQL注入保护可能是使用cfqueryparam的最关键的好处,但还有其他好处。最明显的是,使用不同的参数多次执行的查询的性能改进。这实际上是绑定变量的主要目的。随之而来的注射保护只是一个不错的副作用。
不能对查询字符串使用 cfqueryparam。它只能用于sql允许你参数化的东西(基本上,只是字符串或数字等文字(。它们不能绑定到关键字或字段名称,更不用说复杂子句了。
FWIW,这是一个SQL限制,而不是ColdFusion问题。