2012-01-07 107 views
3

最近有人提到我們通過表單提交將數據插入SQL數據庫的方法受SQL注入攻擊,並且需要一些建議來加強我們的安全性。將數據存入數據庫:防止SQL注入

下面是插入表格的數據到數據庫的代碼:

 <cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc"> 

      INSERT INTO Schedule_Registrations(
       schedule_id, 
       first_name, 
       last_name, 
       phone_number, 
       email, 
       guest, 
       list_type, 
       datetime_registered 
      ) 
      VALUES(
       #url.schedule_id#, 
       '#FORM.first_name#', 
       '#FORM.last_name#', 
       '#CleanPhoneNumber#', 
       '#FORM.email#', 
       #attendee.guest#, 
       <!--- Values for list types 
        0 = NEVER USE Will cause many many problems 
        1 = Main List 
        2 = Waiting List --->      
       #attendee.list_type#, 
       #createodbcdatetime(now())# 
      )     
     </cfquery> 

CleanPhoneNumber是這樣設置的:

<cfset CleanPhoneNumber = REReplace(form.phone_number, "[^0-9]", "", "ALL") /> 

我被告知要使用,例如,

<cfqueryparam cfsqltype="cf_sql_varchar" value="#form.phone_number#" /> 

但我不知道要更換什麼和在哪裏。當我用這樣的值替換值時,我得到一個錯誤。

任何方向將有幫助..

+0

供參考。我不相信你的 2012-01-08 06:28:30

回答

5

你應該包裝所有表單和URL變量cfqueryparam

您的查詢應該是這樣的:

<cfquery name="InsRegistrant" datasource="#application.Datasource#" dbtype="odbc"> 
    INSERT INTO Schedule_Registrations(
     schedule_id, 
     first_name, 
     last_name, 
     phone_number, 
     email, 
     guest, 
     list_type, 
     datetime_registered 
    ) 
    VALUES(
     <cfqueryparam cfsqltype="cf_sql_integer" value="#url.schedule_id#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.first_name#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.last_name#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#CleanPhoneNumber#">, 
     <cfqueryparam cfsqltype="cf_sql_varchar" value="#FORM.email#">, 
     <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.guest#">, 
     <!--- Values for list types 
      0 = NEVER USE Will cause many many problems 
      1 = Main List 
      2 = Waiting List --->      
     <cfqueryparam cfsqltype="cf_sql_integer" value="#attendee.list_type#">, 
     #createodbcdatetime(now())# 
    )     
</cfquery> 

我不知道我得到了所有的數據類型是正確的,所有數據類型請參見full documentation of cfqueryparam

+0

這是我在想的基本方法,但是有一些語法錯誤。非常好,謝謝! – Nietzsche 2012-01-08 00:14:24

+0

一般來說,ColdFusion的數據源只允許每個CFQuery使用一個sql語句,這樣也有助於Sql注入攻擊。 Cfqueryparam絕對收緊了一些東西,但請注意,您現在很容易受到跨站腳本攻擊。確保您在顯示任何表單之前對其進行清理。 – 2012-01-08 21:15:14

+0

爲了澄清,數據庫類型和驅動程序決定了您是否可以在cfquery中執行多個語句。 MySQL支持多種語句,但connector/j驅動程序(由CF使用)*默認情況下禁用它們。儘管MS SQL驅動程序默認將它們啓用*,即查詢處於危險之中。這取決於。但是像其他人說的那樣,最安全的途徑是防守編碼,並始終使用cfqueryparam。 – Leigh 2012-01-09 02:41:53

0

有幾個好的做法,你可以做。

對於您提供的插入代碼,您可以在插入數據之前明確檢查表單域的輸入。檢查空間和「'」之類的內容。您還希望確保用戶不會看到來自輸入錯誤數據的錯誤消息。這對有人想知道你的表格結構很有用。

否則將插入存儲在存儲過程中,並在調用存儲過程進行插入或更新之前驗證輸入參數。

下面列出了一些可以防止SQL注入攻擊的事情。它與asp.net有關,但無論您使用何種語言,概念仍然適用。

How To: Protect From Injection Attacks in ASP.NET

+0

對不起,我沒有改變這是specfic到codefusion。看起來下面提供的答案會更有幫助。這是解釋他的建議的鏈接。 http://kb2.adobe.com/cps/300/300b670e.html – SoftwareCarpenter 2012-01-07 23:56:45

+0

儘管如此,一些很好的信息,謝謝。 – Nietzsche 2012-01-08 00:21:54