2015-10-14 55 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執行此操作時,我改用表值參數。 –

相關問題