我正在使用CFLoop
构建动态 SQL查询。
我正在使用CFSaveContent
迭代变量并构建查询,然后我使用CFQuery
在PreserveSingleQuotes
中执行它。
这很好但这个方法的问题是我不能使用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
上崩溃
答案 0 :(得分:0)
诀窍是使用list
的{{1}}参数。它将正确格式化查询数据,转义引号(如果需要)和所有。
如果列表是数值(例如在cfqueryparam
语句中):
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">
。