我的指示是在将变量传递到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>
答案 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