2010-04-07 260 views
9

如何防止SQL注入的ColdFusion?我對語言/框架頗爲陌生。如何防止SQL注入與ColdFusion

這是我的示例查詢。

<cfquery name="rsRecord" datasource="DataSource"> 
    SELECT * FROM Table 
    WHERE id = #url.id# 
</cfquery> 

我看到傳遞url.id的風險。

回答

18

使用<cfqueryparam>標記爲您的ID:
http://www.adobe.com/livedocs/coldfusion/6.1/htmldocs/tags-b20.htm

<cfquery name="rsRecord" datasource="DataSource"> 
    SELECT * FROM Table 
    WHERE id = 
    <cfqueryparam value = "#url.id#" 
     CFSQLType = "CF_SQL_INTEGER"> 
</cfquery> 
+0

@Joel Coehoorn - 你能舉一個例子嗎?謝謝! – 2010-04-07 13:28:42

4
  • 使用參數化存儲過程
  • cfqueryparam
  • 錯誤圍繞單獨的查詢處理
  • 錯誤通過<cferror>處理站點
  • 邏輯限制了來自特定IP在給定的時間
  • 確保數據庫用戶賬號只能訪問應該
0

使用cfqueryparam是防止SQL注入是好的。但是,如果您想使用cfqueryparam,則無法在cfquery標記中使用cachewithin。我的另一個建議就是這樣做

把這個條件放在頁面的頂部。

< CFIF IsDefined( 「ID」)AND NOT則IsNumeric(ID)> < cfabort showerror = 「無效的查詢字符串」 > </CFIF >

在查詢標籤,使用就像這樣:

WHERE ID = #Val(ID)#

也參見,如何防止: http://ppshein.wordpress.com/2008/08/28/block-ip-in-coldfusion/

+0

比手動實施數據庫保護更好地手動實施緩存。 – 2010-05-21 09:16:55

+0

可能更好地使用cfparam來強制打字至少,但是我同意,最好搞砸緩存而不是搞砸安全 – Grey 2010-05-21 13:16:29

3

除了cfqueryparam您可以在頁面頂部使用cfparam包含傳遞給它的每個變量的SQL。這也有助於文檔。

例如

<cfparam name="url.id" type="integer"> 

或更先進:

<cfparam name="url.id" type="regex" pattern="\d" default=""> 

由於正則表達式模式是允許的,這些可以非常強大:

<cfparam name="form.place" type="regex" pattern="[A-Z0-9]{1,6}|" default=""> 
     <!--- Upper case Alpa or Numeric, 1-6 characters or empty string ---> 

另外,還要確保你在應用程序中使用cferror。 cfmapplication.cfc以防止暴露您的查詢表和列名稱。