【问题标题】:Trouble adding cfqueryparam tags添加 cfqueryparam 标记时遇到问题
【发布时间】:2012-07-18 02:42:35
【问题描述】:

我正在尝试保护此代码,但每次添加 cfqueryparam 标记时都会收到有关参数绑定的错误。我确定我将cfsqltype 属性设置为正确的值。最后一个 select 语句是所有地狱都崩溃的地方。

<CFQUERY name="getLatestSurveyID" datasource="#REQUEST.dsn#">
    SELECT TOP 1
        SurveyID
    FROM
        TUser_WelcomeHome
    ORDER BY
        SurveyID DESC
</CFQUERY>


    <!--- Throw the Reasons/Subreasons into the DB --->
    <!---adding cfqueryparam tags breaks following CFIF block--->
<CFIF ListLen(SESSION.WHSurveyStruct.reasonString, ";") gt 0>
    <CFQUERY name="insertReasons" datasource="#REQUEST.dsn#">
        INSERT INTO TWelcomeHome_Reason
        (ReasonID, SubReasonID, SurveyID)
        SELECT #sanitize(ListFirst(SESSION.WHSurveyStruct.reasonString, ";"))#, #sanitize(getLatestSurveyID.SurveyID)# <!---error occures if adding cfqueryparam tags on this line--->
        <CFLOOP list="#sanitize(ListRest(SESSION.WHSurveyStruct.reasonString, ';'))#" index="thisReason" delimiters=";">
            UNION ALL
            SELECT #sanitize(thisReason)#, #sanitize(getLatestSurveyID.SurveyID)#
        </CFLOOP>

    </CFQUERY>

上面的代码可以工作,但如果我做了以下更改,它将无法工作:
&lt;cfqueryparam value=#sanitize(getLatestSurveyID.SurveyID)# cfsqltype="cf_sql_integer"&gt;

这里是参数化导致的错误
&lt;cfqueryparam value=#sanitize(getLatestSurveyID.SurveyID)# cfsqltype="cf_sql_integer"&gt;

执行数据库查询时出错。 [宏媒体][SQLServer JDBC Driver][SQLServer]INSERT 语句与 FOREIGN KEY 冲突 约束“FK_WelcomeHome_TSupplier”。冲突发生在 数据库“d21wca1”,表“dbo.TSupplier”,列“SupplierID”。这 发生错误 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 215 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 183 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 174 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 1 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 215 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 183 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 174 行调用自 D:/Resource/www/dev/ww1test.owktravel.com/welcome_survey/welcome_survey_router.cfm: 第 1 213 行:#sanitize(SESSION.WHSurveyStruct.SupplierID)#NULL, 214:#sanitize(SESSION.WHSurveyStruct.CruiselineID)#NULL, 215:#sanitize(SESSION.WHSurveyStruct.UserID)#216:)217:

编辑:我仍然无法理解循环在做什么。 SELECT 语句不是缺少FROM 吗?

【问题讨论】:

  • 除了地狱般的崩溃,你的错误是什么?
  • @EvikJames 我不在现场,但会在 24 小时内发布错误详情。
  • 您发布的错误与 cfqueryparam 无关,而是与数据库的引用完整性有关。您在上面提供的代码中甚至没有发生错误。上面的查询无论如何都不应该工作,因为您要插入 3 列,但只有 2 列是您指定的值。
  • @nosilleg 只有在我将 s 添加到我提到的代码中时才会发生错误。如果发生 SQL 错误,ColdFusion 并不总是报告正确的行,它可能会报告结束 标记所在的行。但是你认为数据库有问题吗?我绝对不是这方面的专家
  • The INSERT statement conflicted with the FOREIGN KEY constraint "FK_WelcomeHome_TSupplier"... 表示您试图在 SupplierID 列中放入一个值,该值在主表中不作为主键存在。但是你上面的代码没有提到供应商ID,所以我看不出它到底哪里出错了。也许关系本身是错误的,并且您已将 SurveyID 绑定到 SupplierID 或类似的东西。

标签: sql coldfusion sql-injection cfqueryparam


【解决方案1】:

不能以您使用它的方式在 SELECT 子句中使用。

它只能用于 WHERE 子句或“正常”INSERT 或 UPDATE 的一部分

【讨论】:

  • True.... 但有时 vars 出现在整个“select”子句中的子选择中 - 在这些情况下 cfqueryparam 很好,对吧?
  • 马克,我相信是这样......但它会成为 SELECT 的一部分:D
  • 为什么选择语句没有FROM
【解决方案2】:

我对如何/何时/为什么/等使用&lt;cfqueryparam&gt; 所做的here 的解释可能会有所帮助。为了便于参考,我将在此处复制它。

要记住 [...] 是 SQL 语句有两个部分:SQL“命令”和 SQL 命令使用的数据。只有数据可以参数化。仔细想想,这是有道理的:SQL 命令本身并不是“参数”。

可以在此处的 CF 上下文中进行类比。考虑一下这个说法:

<cfset variables.foo = "bar">

可以用传入的值“参数化”它:

<cfset variables.foo = URL.foo>

(本例中 URL.foo 是一个参数)

但没想到会这样做:

<#URL.tag# variables.foo = "bar">

(这是一个非常人为的例子,但它证明了这一点)。

我认为就&lt;cfquery&gt; 中的 SQL 而言,情况有些混乱,因为整个事情只是 CF 中的一个字符串,字符串的任何部分都可以用变量(列名、布尔运算符、整个子句等)。因此,通过扩展,人们可能会认为任何变量都可以替换为&lt;cfqueryparam&gt;。正如我们现在所知,情况并非如此,因为就 CF 而言,它只是一个字符串,但它被视为 DB 的 code,因此需要符合 DB 的编码语法。

【讨论】:

    【解决方案3】:

    我不确定您为什么要使用该语法进行 SQL 查询。您可以使用以下方法插入多行数据:

    INSERT INTO myTable(column1, column2, column3)
    VALUES('a','b','c'), ('d','e','f');
    

    因为您绝对可以在 VALUES 子句中使用 cfqueryparams。 T认为这应该可以解决您的问题。只需在循环中构建 VALUES 子句,而不是所有那些 SELECT/UNIONS。这对你有用吗?

    【讨论】:

    • IIRC,它取决于数据库。并非所有人都支持这样的多个值子句。不幸的是 Celeritas 没有提到他使用的是哪个数据库和版本。
    • 啊!你是对的,当然。我有一个假设 MS SQL 的坏习惯。 ;)
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 2011-09-08
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多