这个SQL语句到底是什么?选择内插?

时间:2012-06-22 22:08:43

标签: sql tsql coldfusion code-injection

我的指示是在将变量传递到insert语句时调用函数以防止代码注入。以下代码执行什么以及实际插入数据库的内容是什么?为什么这没有value语句,select内似乎有insert

<CFQUERY NAME="Survey1" DATASOURCE="#APPLICATION.mainDSN#">
    INSERT INTO TWHSurvey_QA
    (Comment, QuestionID, SurveyID, Rank)
    <cfloop from="1" to="#SESSION.lastPage#" index="curPage">
        <cfloop from="1" to="#ArrayLen(SESSION.HQQuestionStruct.pagesQuestions[curPage])#" index="curQuestion">
            SELECT  
                <cfif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Type eq 1>
                    <cfif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans neq "">
                        '#SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans#',
                    <cfelse>
                        NULL,
                    </cfif>
                <cfelse>
                    <cfif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Comment_Val neq "">
                        '#SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Comment_Val#',
                    <cfelse>
                        NULL,
                    </cfif>
                </cfif>

                #SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].QuestionID#,
                #getLatestSurveyID.SurveyID#,

                <cfif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Type eq 2>
                    <cfif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans neq "" AND SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans neq 0>
                        #SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans#
                    <cfelse>
                        NULL
                    </cfif>
                <cfelseif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Type eq 3>
                    <cfif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans eq "Yes">
                        1
                    <cfelseif SESSION.HQQuestionStruct.pagesQuestions[curPage][curQuestion].Cur_Ans eq "No">
                        0
                    <cfelse>
                        NULL
                    </cfif>
                <cfelse>
                    NULL
                </cfif>
            <CFIF curPage eq SESSION.lastPage AND curQuestion eq ArrayLen(SESSION.HQQuestionStruct.pagesQuestions[curPage])>
            <CFELSE> 
                UNION ALL
            </CFIF>
        </cfloop>
    </cfloop>
</CFQUERY>

2 个答案:

答案 0 :(得分:3)

上面的答案很好地解释了SQL和CFML在这里如何协同工作。彼得的评论也很重要。

然而,它错过了你的部分问题。

您询问有关防止代码注入的问题,并且您在此处未实现此目的。我假设这些会话变量最初来自一个表单 - 基于它们的名称 - 这意味着注释变量可以包含任何内容,只需将它直接放入DB中就可以将自己暴露给代码注入。

这里最快的胜利是永远不要将动态值硬编码到SQL字符串中,而是通过<cfqueryparam>将它们作为参数传递。这样可以将更多统一的SQL传递给数据库,因此数据库有机会维护较少的编译SQL语句,这也会给你带来轻微(但通常是有形的)性能提升。

同样在你的情况下,使用<cfqueryparam>标签可以简化/澄清是否传递空的逻辑:根据你的条件设置一个摘要变量,然后使用该变量作为{{的值1}} null的属性。

这不是您唯一需要做的事情:它只能保护您免受SQL注入。你可能会在注释字段中让自己对JS注入开放。你也需要考虑处理它。

答案 1 :(得分:2)

使用INSERT时,有两种方法:

INSERT INTO yourTable (col1, col2)
VALUES (val1, val2)

OR

INSERT INTO yourTable (col1, col2)
SELECT col1, col2
FROM table1

您的查询是插入到您的表TWHSurvey_QA中,但它是选择变量,但是您将插入一些值的If语句

基本上它是选择变量:

INSERT INTO TWHSurvey_QA (Comment, QuestionID, SurveyID, Rank)
SELECT 
    If statement to decide the comment value
    , QuestionId
    , SurveyID
    , If statement to decide the Rank value