我正在使用CFLoop
构建动态SQL查询。我正在使用CFSaveContent
遍历变量并构建查询,然后使用 PreserveSingleQuotes
在CFQuery
中执行它。这工作正常,但这种方法的问题是我不能使用CFQueryParam
所以我的查询容易受到注入。想知道这个问题是否有任何解决方法?
更新:
<cfsavecontent variable="sqlstring">
SELECT id
,(CASE
<cfloop query="qGetRules">
WHEN val1 >=#qGetRules.equ# AND val2 >#arguments.leve# THEN 1
</cfloop>
ELSE 0
END) AS criteria
FROM mt4_users
</cfsavecontent>
<cfquery name="qGetEquity" datasource="mydatasource">
#PreserveSingleQuotes(variables.sqlstring)#
</cfquery>
所以在这个例子中,如您所见,我不能将cfqueryparam
用于arguments.leve
,因为它会在PreserveSingleQuotes
崩溃
是使用 cfqueryparam
的 list
参数。它将正确格式化查询的数据、转义引号(如果需要(和所有内容。
如果列表是数值(例如,在 WHERE X IN (1,2,3,4)
语句中(:
<cfqueryparam value="#arguments.foo#" cfsqltype="cf_sql_integer" list="true">
如果列表是字符串值:
<cfqueryparam value="#arguments.foo#" cfsqltype="cf_sql_varchar" list="true">
这也适用于cfprocparam
。