2010-11-08 58 views
2

我在做一個項目,我有一個登錄頁面。阻止我的應用程序從SQL注入?

我正在限制用戶進入

AND OR NOT XOR & |^

是否足以防止SQL注入我的應用程序?

+0

哇,沒有你的地址限制SQL注入輸入。它的完全引用標記和整型轉換。 – rook 2010-11-08 18:05:02

+0

你沒見過[羅伯特'); DROP TABLE Students; - ](http://xkcd.com/327/)呢? ;) – takeshin 2010-11-08 19:01:22

回答

12

不,完全沒有。

例如,我仍然可以輸入自己的用戶名是:

; DELETE FROM Users -- 

這仍然取決於您的數據庫結構和應用程序代碼,擦拭您的整個用戶表。

爲了充分保護自己免受SQL注入攻擊,您應該轉義任何用戶輸入並使用參數化查詢或存儲過程(如果您使用的是存儲過程,請確保您沒有在存儲過程中動態生成SQL )與數據庫進行交互。

-1

您應該將值作爲參數傳遞給存儲過程。無論用戶進入這種方式只是當作一個值,而不是附加到聲明和執行

6

不應該去尋找自己的用戶名/密碼的特殊字詞/字符。因爲你總是會錯過什麼。

相反,如果你有嵌入式SQL,你應該使用參數化查詢。如果你這樣做了所有的查詢,那麼你將從sql注入安全。現在,XSS是整個其他事項..;)

這已經深入介紹這個網站,只要搜索SQL注入。

2

使用存儲過程或參數化查詢將防止SQL注入。

1)除此之外,如果使用的是ASP.NET,可以啓用頁級別屬性「ValidateRequest =真」,其可以驗證是否有任何輸入字符串的可導致腳本注射

2 )確保您不會向最終用戶顯示實際的系統生成錯誤。這將導致黑客進一步探測並破壞系統。

3)如果您使用的是Web服務消費和數據同步到你的數據庫,持久化數據之前驗證所有必要的字段。

0

這裏是一個很好的堆棧溢出鏈接:What is SQL injection?

其次,不要忘了,不要緊,你在UI做驗證,人們總是可以構建自定義的HTTP請求,並將它們發送到您的服務器(使用螢火蟲編輯很簡單)。

1

絕對不是!

避免SQL注入的最簡單方法是使用參數化查詢。

看到這個SO問題:Preventing SQL Injection in ASP.Net VB.Net及其所有的答案給你的想法。

總之,我從來沒有使用串聯字符串查詢,但總是參數。這樣就沒有任何危險,這是防止SQL注入最安全的方法。

0

像其他人一樣說。參數化輸入。

下面是我在工作中編寫的一些代碼(已刪除特定工作代碼)的代碼片段。這並不完美,但我的主要工作不是編程,而我在寫這篇文章時仍在研究C#。如果我現在寫這個,我會用一個datareader而不是一個數據集。

但是請注意,我是如何使用「da.SelectCommand.Parameters.AddWithValue」使用變量在實際的SQL字符串,並指定變量

public Boolean Login(string strUserName, string strPassword) 
     { 
      SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection(); 
      DataSet ds = null; 
      SqlDataAdapter da = null; 

      sqlConn.ConnectionString = strConnString; 

      try 
      { 
       blnError = false; 
       sqlConn.Open(); 

       ds = new DataSet(); 
       da = new SqlDataAdapter("select iuserid from tbl_Table where vchusername = @vchUserName and vchpassword = @vchPassword", sqlConn); 

       da.SelectCommand.Parameters.AddWithValue("@vchUserName", strUserName); 
       da.SelectCommand.Parameters.AddWithValue("@vchPassword", strPassword); 

       da.SelectCommand.CommandTimeout = 30; 
       da.Fill(ds); 

       if (ds.Tables[0].Rows.Count > 0) 
       { 
        iUserId = (int)ds.Tables[0].Rows[0]["iuserid"]; 
       } 
      } 
      catch (Exception ex) 
      { 
       blnError = true; 
       Log("Login: " + ex.Message); 
      } 
      finally 
      { 
       if (sqlConn.State != ConnectionState.Closed) 
        sqlConn.Close(); 
       if (da != null) 
        da.Dispose(); 
       if (ds != null) 
        ds.Dispose(); 
      } 
      if (blnError) 
       return false; 
      if (iUserId > 0) 
       return true; 
      return false; 
     }