1

私の指示は、変数を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>
4

2 に答える 2

3

上記の回答は、ここで SQL と CFML がどのように連携するかをよく説明しています。ピーターのコメントも重要です。

ただし、質問の一部を見逃しています。

あなたはコード インジェクションからの保護について質問していますが、ここではそれを達成していません。これらのセッション変数は、名前に基づいて、もともとフォームから来ていると仮定しています。つまり、コメント変数には何でも含まれている可能性があり、そのように DB で直接叩くだけでコードインジェクションにさらされます。

ここでの最速の勝利は、動的な値を SQL 文字列にハードコーディングせず、代わりに を介してパラメーターとして渡すこと<cfqueryparam>です。これには、より均一な SQL を DB に渡すという追加のボーナスがあるため、DB はコンパイルされた SQL ステートメントをより少なく維持する可能性があり、これによりわずかな (ただし通常は具体的な) パフォーマンスの向上も得られます。

また、<cfqueryparam>タグを使用すると、null を渡すかどうかのロジックを簡素化/明確化できます。条件に基づいてサマリー変数を設定し、その変数を のnull属性の値として使用します<cfqueryparam>

ただし、実行する必要があるのはこれだけではありません。SQL インジェクションから保護するだけです。そのコメント欄で、あなたも JS インジェクションにさらされているかもしれません。その対応も視野に入れる必要があります。

于 2012-06-23T07:31:40.697 に答える
2

を使用するINSERT場合、2つの方法があります。

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

また

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

クエリはテーブルに挿入していますが、変数を選択していますが、挿入する値の一部にIfステートメントがあります。TWHSurvey_QA

基本的には、変数を選択しています。

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 に答える