2016-02-04 36 views
1

所以我已經被傳遞到查詢在不同的文件構成的字符串作爲一個全局變量,我需要綁定(遺留代碼):故障使用cfqueryparam與SQL查詢字符串

<cfset queryString="((playerID=1223) OR playerID=1224))"> 

<cfquery name="testQuery"> 
    SELECT * 
    FROM teamRoster 
    WHERE teamID = 9876 
    AND <cfqueryparam value="#queryString#" cfsqltype="CF_SQL_VARCHAR"> 
</cfquery> 

有在這裏使用cfqueryparam查詢字符串的方法?或者有沒有一種不同的方法來保護自己免受SQL注入?謝謝你的幫助!

+0

這應該解釋爲什麼這個想法在SQL語句和參數的上下文中沒有意義:http://blog.adamcameron.me/2012/07/what-one-can-and-cannot-do-with .html –

回答

1

不能對查詢字符串使用cfqueryparam。它只能用於那些SQL允許你參數化的東西(基本上,只是字符串或數字等文字)。它們不能綁定到關鍵字或字段名稱,更不用說複雜的子句。

FWIW,這是一個SQL限制,而不是ColdFusion問題。

+0

感謝您的解釋 – ConorBaumgart

3

(太徵求意見長......)

沒有,因爲cfqueryparam(或綁定變量)的目的是防止你正在嘗試做的非常的事,這是執行字符串作爲SQL命令 。綁定變量不能用於任何必須由dbms解釋爲命令的任何內容,例如表或列名稱,運算符等等 - 僅包含數字或簡單字符串等文字。

由於cfqueryparam只能在cfquery標籤內使用,所以cfscript version使參數化動態語句更容易一些。但是,只要你必須執行任意字符串,就真的有no bullet proof way to protect the query against sql injection。如果可能的話,我會建議重組以消除動態SQL。鑑於它是一款傳統應用程序,我意識到它更具挑戰性,但最終的結果是值得的。

FWIW,請記住,雖然SQL注入保護可能是使用cfqueryparam最關鍵的好處,但有other benefits as well。最值得注意的是多次執行查詢的性能改進,具有不同的參數。這實際上是綁定變量的主要目的。伴隨它的注射保護只是一個很好的副作用。