【发布时间】:2012-07-18 02:42:35
【问题描述】:
我正在尝试保护此代码,但每次添加 cfqueryparam 标记时都会收到有关参数绑定的错误。我确定我将cfsqltype 属性设置为正确的值。最后一个 select 语句是所有地狱都崩溃的地方。
<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">
执行数据库查询时出错。 [宏媒体][SQLServer JDBC Driver][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 吗?
【问题讨论】:
-
除了地狱般的崩溃,你的错误是什么?
-
@EvikJames 我不在现场,但会在 24 小时内发布错误详情。
-
您发布的错误与 cfqueryparam 无关,而是与数据库的引用完整性有关。您在上面提供的代码中甚至没有发生错误。上面的查询无论如何都不应该工作,因为您要插入 3 列,但只有 2 列是您指定的值。
-
@nosilleg 只有在我将
s 添加到我提到的代码中时才会发生错误。如果发生 SQL 错误,ColdFusion 并不总是报告正确的行,它可能会报告结束 标记所在的行。但是你认为数据库有问题吗?我绝对不是这方面的专家 -
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_WelcomeHome_TSupplier"...表示您试图在 SupplierID 列中放入一个值,该值在主表中不作为主键存在。但是你上面的代码没有提到供应商ID,所以我看不出它到底哪里出错了。也许关系本身是错误的,并且您已将 SurveyID 绑定到 SupplierID 或类似的东西。
标签: sql coldfusion sql-injection cfqueryparam