2014-02-27 30 views
6

我主要使用CFQUERYPARAM來防止SQL注入。由於查詢查詢(QoQ)不會觸及數據庫,因此在它們中使用CFQUERYPARAM是否有任何邏輯原因?我知道與cfsqltypemaxlength不匹配的值將會引發異常,但是應該在這之前驗證這些值並顯示友好的消息(從UX視角)。查詢查詢中是否有任何合乎邏輯的理由使用CFQUERYPARAM?

+2

我會問你想通過不使用它獲得什麼? –

回答

6

在我看來,這是一個更簡單的情況。

<cfquery name="NoVisit" dbtype="query"> 
select chart_no, patient_name, treatment_date, pr, BillingCompareField 
from BillingData 
where BillingCompareField not in 
(<cfqueryparam cfsqltype="cf_sql_varchar" 
value="#ValueList(FinalData.FinalCompareField)#" list="yes">) 
</cfquery> 

另一種方法是使用QuotedValueList。但是,如果該值列表中的任何內容包含撇號,則cfqueryparam將會將其轉義。否則,我將不得不。

編輯從這裏開始

下面是另一個例子,其中不使用查詢參數會導致錯誤。

QueryAddRow(x,2); 
QuerySetCell(x,"dt",CreateDate(2001,1,1),1); 
QuerySetCell(x,"dt",CreateDate(2001,1,11),2); 
</cfscript> 

<cfquery name="y" dbtype="query"> 
select * from x 
<!--- 
where dt in (<cfqueryparam cfsqltype="cf_sql_date" value="#ValueList(x.dt)#" list="yes">) 
---> 
where dt in (#ValueList(x.dt)#) 
</cfquery> 

作爲寫入的代碼引發此錯誤:

Query Of Queries runtime error. 
Comparison exception while executing IN. 
Unsupported Type Comparison Exception: 
The IN operator does not support comparison between the following types: 
Left hand side expression type = "DATE". 
Right hand side expression type = "LONG". 

與查詢參數,上述註釋,代碼執行成功。

8

由於查詢查詢(QoQ)不會觸及數據庫,因此在它們中使用CFQUERYPARAM是否有任何邏輯原因?實際上,它確實會觸及數據庫,即您當前已經存儲在內存中的數據庫。該數據庫中的數據理論上仍然可能通過用戶的某種注入而被篡改。這會影響你的物理數據庫 - 不。這是否會影響應用程序中數據的使用 - 是的。

你沒有提供任何具體的細節,但我會在謹慎的一面犯錯。如果ANY您用來構建查詢的數據來自客戶端,那麼在其中使用cfqueryparam。如果你可以保證你的查詢中沒有任何元素來自客戶端,那麼我認爲不使用cfqueryparam就可以。

另外,使用cfqueryparam也有助於優化數據庫的查詢,儘管我不確定查詢的查詢是否爲真。它也爲你撇開字符,如撇號。