2015-10-14 37 views
1

我正在使用CFLoop构建一个动态的SQL查询。 我正在使用CFSaveContent遍历变量并构建查询,然后我使用PreserveSingleQuotesCFQuery中执行它。 这工作正常,但这种方法的问题是,我不能使用CFQueryParam,所以我的查询是脆弱的注射。 是否想知道这个问题是否有解决方法?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> 

所以在这个例子中,你可以看到我不能使用cfqueryparamarguments.leve,因为它会在PreserveSingleQuotes

+0

您是否查看了[cffs和cfqueryparam]的[cfscript等价物](https://helpx.adobe.com/coldfusion/cfml-reference/script-functions-implemented-as-cfcs/query)上的文档。 HTML)? – Leigh

+1

理论上,我们所有人一直都在验证用户提供的所有字段。单独依靠查询参数来确保安全性并不像您所能做到的那样安全。此外,PreserveSingleQuotes有它的位置,但我从来没有成功处理撇号。 –

+0

由于这是一个移动web服务,我无法验证用户的输入(在移动应用程序旁边)。如果有人嗅探URL并尝试注入SQL,我需要停止它。 – BlackM

回答

0

诀窍崩溃是使用list参数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">

这也适用于cfprocparam

+0

我在问题中没有看到任何暗示OP只是生成一个值列表的问题。另外,使用'cfprocparam'传递一个数值列表并不总能达到目标。当我使用sql-server执行此操作时,我改用表值参数。 –

相关问题