在查询查询中使用CFQUERYPARAM是否有逻辑上的理由?

7

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


2
你不使用它,你认为会得到什么好处? - Sean Coyne
2个回答

8
由于查询语句(Query-of-Queries, QoQ)并不会涉及数据库,是否有必要在其中使用CFQUERYPARAM呢?实际上,它确实会涉及到数据库,即你目前存储在内存中的数据库。用户仍然可能通过某种注入方式篡改该数据库中的数据。虽然这不会影响你的物理数据库,但却会影响你应用程序中数据的使用。
你没有提供具体细节,但我建议谨慎处理。如果你用于构建查询的任何数据都来自客户端,则需要在其中使用cfqueryparam。如果你可以保证查询中的所有元素都不来自客户端,那么可能不需要使用cfqueryparam。
此外,使用cfqueryparam还有助于优化查询操作,尽管我不确定Query-of-Queries是否也适用。它还可以为你转义字符,如撇号。

6

在我看来,这里有一个比较简单的情况。

这涉及到IT技术相关内容。
<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".

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接