在查询查询中使用CFQUERYPARAM是否有任何逻辑上的原因?

时间:2014-02-27 16:21:26

标签: tsql coldfusion cfquery cfqueryparam

我主要使用CFQUERYPARAM来阻止SQL注入。由于查询查询(QoQ)不接触数据库,是否有任何逻辑上的理由在其中使用CFQUERYPARAM?我知道与cfsqltypemaxlength不匹配的值会引发异常,但是,这些值之前应该已经过验证并显示友好消息(从UX角度来看)。

2 个答案:

答案 0 :(得分:8)

由于查询查询(QoQ)没有触及数据库,是否有任何逻辑上的理由在其中使用CFQUERYPARAM?实际上,它确实触及数据库,即您当前拥有的数据库存储在内存中。理论上,该数据库中的数据仍然可以通过用户的某种注入进行篡改。这会影响您的物理数据库吗 - 没有。这是否会影响应用程序中数据的使用 - 是的。

您没有提供任何具体细节,但我会谨慎行事。如果您用于构建查询的 ANY 数据来自客户端,则在其中使用cfqueryparam。如果您可以保证查询中没有任何元素来自客户端,那么我认为不使用cfqueryparam是可以的。

顺便说一下,使用cfqueryparam也有助于优化数据库的查询,尽管我不确定查询查询是否属实。它也像撇号一样逃脱了你的角色。

答案 1 :(得分:6)

在我看来,这是一种更简单的情况。

<cfquery name="NoVisit" dbtype="query">
select chart_no, patient_name, treatment_date, pr, BillingCompareField
from BillingData
where BillingCompareField not in 
(<cfqueryparam cfsqltype="cf_sql_varchar" 
value="#ValueList(FinalData.FinalCompareField)#" list="yes">)
</cfquery>

另一种方法是使用QuotedValueList。但是,如果该值列表中的任何内容包含撇号,则cfqueryparam将对其进行转义。否则我将不得不这样做。

编辑从此处开始

这是另一个不使用查询参数导致错误的示例。

QueryAddRow(x,2);
QuerySetCell(x,"dt",CreateDate(2001,1,1),1);
QuerySetCell(x,"dt",CreateDate(2001,1,11),2);
</cfscript>

<cfquery name="y" dbtype="query">
select * from x
<!--- 
where dt in (<cfqueryparam cfsqltype="cf_sql_date" value="#ValueList(x.dt)#" list="yes">) 
--->
where dt in (#ValueList(x.dt)#)
</cfquery>

写入的代码会抛出此错误:

Query Of Queries runtime error.  
Comparison exception while executing IN.
Unsupported Type Comparison Exception: 
The IN operator does not support comparison between the following types: 
Left hand side expression type = "DATE".
Right hand side expression type = "LONG".

使用上面注释掉的查询参数,代码执行成功。