在我的ColdFusion 11的應用程序,使用SQL Server 2008 R2,我下面一個CF組件內CFQUERY標籤:ColdFusion的單引號問題與SQL查詢
<cfquery name="result_set" dataSource="#request.dsn_name#">
select name, state from myTable #REReplace(where_clause,"''","'","ALL")#
</cfquery>
這裏where_clause
是一個變量。 CF用兩個單引號替換,因此我使用REReplace函數將兩個單引號替換爲一。所以我的查詢會改變,例如從
select name, state from myTable WHERE name IN (''ABC'')
這樣:
select name, state from myTable WHERE name IN ('ABC')
問題是,當一個名字列值包含一個單引號爲好。例如。
select name, state from myTable WHERE name IN ('Smith's bat')
在這種情況下查詢失敗。我該如何解決這些問題。我嘗試了PreserveSingleQuotes,但它具有相同的問題,其中列的值使用單引號。
UPDATE
這個程序使用的ColdFusion MX 7原作者是創建基於某些條件where_clause變量動態字符串開發年前由一個人。這是一個很長的cfs文件,有幾個條件用於爲where_clause創建動態字符串。因此,使用cfqueryparam可能不合適,或者可能需要徹底檢查客戶不允許的代碼。
更好的方法是重寫查詢以使用參數('')。這樣做會非常容易出錯,並可能導致[** SQL注入**](https://www.owasp.org/index.php/SQL_Injection)漏洞。 –
...並且是您首先遇到查詢問題的原因。不要使用那種動態sql。相反,在cfquery中構建sql並在所有參數上使用cfqueryparam(或者查看使用cfscript查詢,這爲「參數化」sql提供了更多的靈活性)。這既能保護數據庫,又能消除這種類型的錯誤。 – Leigh
如果你想堅持在''調用之外創建你的SQL字符串,可以使用'queryExecute()'來代替它,它允許你將參數佔位符放入SQL字符串中;然後將參數值傳遞給單獨的數組/結構。只是*不要*將值硬編碼到SQL字符串中。這是可怕的,尷尬的,危險的。 –