2011-11-17 46 views
5

對於由我做客戶端檢查用戶,文本框電子郵件條目查找電子郵件是否有效與否如何防止SQL注入的asp.net網站

string emailexist = "SELECT COUNT(DISTINCT UserID) as count FROM tbl_user WHERE [email protected] ";  


    <asp:RegularExpressionValidator ID="RegularExpressionValidator2" ValidationGroup="Login" ControlToValidate="txtUserName" 
          ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" CssClass="Error" 
          runat="server" /> 

是這個規則表達式足以防止電子郵件的SQL注入。

其他文本:

string groupExistQuery = "SELECT COUNT(DISTINCT GroupID) as count FROM tbl_group WHERE [email protected]"; 

我做在服務器端查詢,以檢查用戶輸入組名是否在數據庫中已經可用,還有就是在這裏進行SQL注入有很大的可能性。我應該如何防止它。

+1

我以爲我們會一直在這個:不要使用'asp'標籤。 –

+0

@JoelCoehoorn - 我真的希望對meta的討論導致'asp'被改爲'asp-classic' :( – Polynomial

+0

+1僅僅用於詢問 –

回答

8

正則表達式是無關 SQL注入(黑名單等是從來沒有最強的方法);然而,參數@Email的使用意味着(假設它保持參數化),即而不是易受SQL注入影響。

SQL注入涉及不適當的輸入級聯;打擊它的主要工具是參數,這已經發生在這裏。

例如,如果你這樣做:

var sql = "SELECT ...snip... WHERE Email='" + email + "'"; // BAD!!!!! 

然後在很大程度上容易受到SQL注入。通過使用參數,該值不被視爲查詢的一部分,因此攻擊者不具有攻擊向量。

+1

在大多數(如果不是全部的話)語言和DBMS系統中都是如此。查詢幾乎總是最好的解決方案。我無法計算我看到有人使用自定義驗證代碼的次數,然後當有人用「DROP TABLES」命令讓他們驚訝時,會看到驚奇的表情。 – Polynomial

4

您可以通過不使用直接SQL並使用參數化查詢和/或存儲過程來阻止它。

6

如果使用參數化的值,那麼無論如何,您都無法通過參數注入,只能通過連接值進行注入。

0

Here是來自微軟的回覆模式&練習組對你的問題。

一般來說,簡單的規則是:不使用動態SQL生成,如果你這樣做,則清理你的輸入。

從不只是連接字符串來構建您的SQL查詢。如果您需要在您的應用程序中自行構建查詢,那麼使用帶參數的參數化SQL查詢 - 這樣您就安全起來了。

下面是我提供的鏈接上面的文檔的示例:

DataSet userDataset = new DataSet(); 
    SqlDataAdapter myCommand = new SqlDataAdapter( 
      "LoginStoredProcedure", connection); 
    myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; 
    myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11); 
    myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text; 

    myCommand.Fill(userDataset); 
+0

我的評論已解決。繼續:) –

+0

在我看來,使用類型安全參數只是一種消毒輸入的方法。 –

+0

請參閱我對馬克答案的評論。自定義過濾不可能考慮到所有可能的SQL注入途徑,包括攻擊者想要的所有語法,編碼和欺騙。我看到有人嘗試過這種方式,有些人對他們的過濾非常聰明,但是每當我看到他們的系統被強制執行時,都會在災難中結束。參數化查詢是絕對的解決方案,因爲它們將值視爲完全分離的上下文中的數據,並且永遠不能被解析爲代碼。 – Polynomial

1
  1. 使用參數化值
  2. 編碼您的字符串
+1

沉重,重1;選項2是大多數人會**錯誤的。就個人而言,我會限制任何2使用明確白名單值(而不是黑名單) –

+0

@MarcGravell - 同意。轉換爲適當的類型確實會提醒您格式問題,但這當然不是安全措施。 – Polynomial

+0

Html編碼確實可以防止一些攻擊 – user182630