2011-08-02 53 views
6

有人可以解釋,如果不包括cfqueryparam的cfsqltype仍然有用的SQL注入保護?而且cfqueryparam與cfsqltype和w/o cfsqltype實際上發生了什麼。是否包含cfqueryparam的cfsqltype,對於sql注入保護仍然有用?

<!--- without cfsqltype---> 
<cfqueryparam value="#someValue#"> 

<!--- with cfsqltype---> 
<cfqueryparam value="#someValue#" cfsqltype="cf_sql_char"> 
+0

你是什麼意思「仍然有用」?之前有用嗎? –

+1

我想我的意思是從我讀的所有材料中,cfsqltype總是存在於cfqueryparam中,但它不是必需的屬性。我認爲它是有用的,但作爲「驗證」而不是「sql查詢注入保護」。我想要一些更多的知識,像你一樣偷看你的意見。 –

+0

我認爲你應該更新你的問題來提供一個例子: webRat

回答

11

要得到一個什麼樣cfsqltype引擎蓋下likley做一個好主意,看看在Java/JDBC PreparedStatement類:http://download.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html

你會發現各種SETINT,的setDate等方法 - 我的理解是當cfsqltype創建準備語句時與相應的方法匹配。

如果您指定了一個類型,那麼ColdFusion需要能夠將可變參數轉換爲該類型,如果不可以,則在將查詢發送到數據庫之前會引發異常。

當您省略cfsqltype時,它可能會調用setObject或setString。接下來發生的行爲取決於您目前使用的JDBC驅動程序。我已經看到了一些情況,即使在傳遞有效變量時忽略該類型也會導致錯誤,但想到的是在MySQL上使用date和datetime。

要考慮的另一件事是,如果你忽略cfsqltype讓我們說一個整數字段,但你傳遞一個非整數值,ColdFusion可能會在連接到數據庫之前拋出異常,並且如果指定了cfsqltype發送查詢,但如果沒有它,則會浪費數據庫服務器上的數據庫連接和執行時間。

2

cfqueryparam的好處之一是在將值發送到數據庫之前進行類型檢查。例如,您指定cf_sql_integer,CF不僅驗證該值是數字,而且它是特定範圍內的整數。當您省略cfsqltype時,CF將使用cf_sql_char。所以你顯然失去了類型檢查日期和數字的東西。

我個人認爲你應該提供一個cfsqltype。然而,即使你沒有,使用cfqueryparam意味着CF使用綁定變量。綁定變量的一個好處是幫助保護您的查詢免受sql注入。所以從這個意義上講,這仍然是一件好事。

我認爲這是有用的,但作爲「驗證」而不是「sql查詢注入 保護」。

更新:不,它仍然適用。保護來自使用綁定變量。由於CF仍然會使用綁定變量,即使沒有類型,我相信基本的SQL注入保護仍然適用。

也就是說,使用cf_sql_char而不是char列可能會強制您的數據庫執行到目標列的數據類型的隱式轉換,有時會產生意外的結果。所以通常我會說你應該指定一個cfsqltype。