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



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

<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问题。

相关内容

  • 没有找到相关文章

最新更新