1

我的指示是在将变量传递到insert语句中时调用函数以防止代码注入。以下代码做了什么以及实际插入数据库的内容是什么?为什么这没有声明,而且里面value似乎有一个?selectinsert

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

2 回答 2

3

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

但是,它错过了您的部分问题。

您询问有关防止代码注入的问题,而您在这里没有做到这一点。我假设这些会话变量最初来自一个表单 - 基于它们的名称 - 这意味着注释变量可以包含任何内容,只需像这样直接在数据库中拍打它,就可以将自己暴露在代码注入中。

这里最快的胜利是永远不要将动态值硬编码到 SQL 字符串中,而是通过<cfqueryparam>. 这具有将更统一的 SQL 传递给 DB 的额外好处,因此 DB 有机会维护更少的已编译 SQL 语句,这也会给您带来轻微的(但通常是有形的)性能提升。

此外,在您的情况下,使用<cfqueryparam>标签可以简化/澄清是否传递 null 的逻辑:根据您的条件设置摘要变量,然后将该变量null用作<cfqueryparam>.

但是,这不是您唯一需要做的事情:它只是保护您免受 SQL 注入。在该评论字段中,您也可能对 JS 注入持开放态度。你也需要考虑处理这个问题。

于 2012-06-23T07:31:40.697 回答
2

使用时INSERT有两种方式:

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

或者

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

您的查询是Inserting into your table TWHSurvey_QA,但它是Selecting variables ,但是您将要插入的某些值周围有 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
于 2012-06-22T22:25:24.343 回答