无法添加cfqueryparam标签

时间:2012-07-12 00:23:47

标签: sql coldfusion sql-injection cfqueryparam

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

<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>

上述代码有效,但如果我做了以下更改,则无法使用:
<cfqueryparam value=#sanitize(getLatestSurveyID.SurveyID)# cfsqltype="cf_sql_integer">

这是由参数化造成的错误  <cfqueryparam value=#sanitize(getLatestSurveyID.SurveyID)# cfsqltype="cf_sql_integer">

  

执行数据库查询时出错。 [Macromedia] [SQLServer JDBC   驱动程序] [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

3 个答案:

答案 0 :(得分:4)

&LT; cfqueryparam&GT;不能像你使用它一样在SELECT子句中使用它。

它只能用于WHERE子句或“普通”INSERT或UPDATE

的一部分

答案 1 :(得分:2)

我对here使用<cfqueryparam>的方式/时间/原因/等的解释可能有所帮助。为了便于参考,我会在这里重现它。

  

要记住的事情是,SQL语句有两部分:SQL“命令”,以及SQL命令使用的数据。只能对参数化数据进行参数化。如果你考虑一下,这是有道理的:SQL命令本身不是“参数”。

     

人们可以在CF环境中思考这个类比。请考虑以下声明:

<cfset variables.foo = "bar">
  

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

<cfset variables.foo = URL.foo>
  

(其中URL.foo是此示例中的参数)

     

但人们不能指望这样做:

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

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

     

我认为,就<cfquery>中的SQL而言,水域有点混乱,因为整个事物只是CF中的一个字符串,并且字符串的任何部分都可以与变量交换掉(列名,布尔运算符,整个子句等)。因此,通过扩展,人们可能会认为任何变量都可以用<cfqueryparam>替换。正如我们现在所知,情况并非如此,因为就CF而言,它只是一个字符串,它被认为是数据库的代码,因此需要符合DB的编码语法。 / p>

答案 2 :(得分:0)

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

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

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