我主要使用CFQUERYPARAM
来防止SQL注入。由于查询查询(QoQ)不涉及数据库,是否有任何逻辑理由在其中使用CFQUERYPARAM?我知道与cfsqltype
和maxlength
不匹配的值会抛出异常,但是这些值应该在那之前已经过验证,并显示友好的消息(从UX角度)。
我主要使用CFQUERYPARAM
来防止SQL注入。由于查询查询(QoQ)不涉及数据库,是否有任何逻辑理由在其中使用CFQUERYPARAM?我知道与cfsqltype
和maxlength
不匹配的值会抛出异常,但是这些值应该在那之前已经过验证,并显示友好的消息(从UX角度)。
在我看来,这里有一个比较简单的情况。
这涉及到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".
使用上面被注释掉的查询参数,代码可以成功执行。