【问题标题】:Trouble using cfqueryparam with sql query strings将 cfqueryparam 与 sql 查询字符串一起使用时遇到问题
【发布时间】:2016-02-05 06:38:05
【问题描述】:

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

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

【问题讨论】:

标签: sql coldfusion cfqueryparam


【解决方案1】:

(对于 cmets 来说太长了...)

不,因为 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。最显着的是使用不同参数多次执行的查询的性能改进。这实际上是绑定变量的主要目的。随之而来的注射保护只是一个很好的副作用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢您的解释
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2021-07-15
    • 2013-06-19
    • 2014-01-29
    • 1970-01-01
    相关资源
    最近更新 更多