2014-01-21 46 views
2

我希望這是正確的地方問,parameters.addwithvalue如何工作?我正在想辦法防範SQL注入?我一直在Stackoverflow上看很多,很多人都說「//針對sql注入」。我一直在盲目地使用它,但現在我必須提交一份關於我的任務的文件,我需要解釋爲什麼它是保護。我一直試圖找到MSDN上的東西,發現這一個:AddWithValue sql注射安全嗎?爲什麼?

SQL injection但它使用parameters.add。然後我讀到他們用.AddWithValue代替.Add,這是真的嗎?這方面的任何官員呢?

那麼基本上,任何人都可以更好地搜索一些防止SQL注入的官方文書工作?或者可以告訴我它是如何工作的?

我不是想讓你做我的工作,我只是找不到我的自我。

我使用它是這樣的:

using (SqlConnection conn = new SqlConnection(connectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
     conn.Open(); 
     String queryString = "DELETE FROM dbo.SecurityAccess WHERE Username = ' @Username "; 
     cmd.CommandText = queryString; 
     cmd.Parameters.AddWithValue("@Username", Username); 
     cmd.ExecuteNonQuery(); 
} 
+0

感謝您的注意,我也會在那裏看看 – MatiasP

回答

1

,如果你不使用它與上面的命令,然後它看起來像參數化的查詢:

string queryString="DELETE FROM dbo.SecurityAccess WHERE Username = '"+txtUserName.Text+"'"; 
在上面的命令的用戶名

將被分配任何用戶進入TextBox(例如:txtUserName)。

如果用戶希望注入一些行爲(添加刪除任何他想做的事/更新或)用給定username他可以進入(txtUserName

=>"'';delete * from users"

則上面的命令後在文本框值如下:

string queryString="DELETE FROM dbo.SecurityAccess WHERE Username = '';delete * from users"; 

終於上面的命令將從users表中刪除所有記錄。

+0

我知道這一點,我更想知道爲什麼這是工作? 我的意思是,我看起來像我只是改變一個標籤的值,這是沒有意義的是安全的? – MatiasP

+0

@MatiasP:你可以看看http://stackoverflow.com/questions/4892166/how-does-sqlparameter-prevent-sql-injection –

5

從SQL注入的角度來看,使用參數通常是安全的(取決於你對SQL中的那些參數所做的...)。你的例子很安全。如何增加這些參數與SQL Ibjection的觀點沒有什麼不同,但是與ADO.Net和SQL性能的觀點有很大不同。由於與參數類型和大小有關的性能問題,因此AddWithValue反模式。在您的示例中,@UserName將是類型爲NVARCHAR的參數,這可能會使WHERE [email protected]謂詞不可用(不會在用戶名上使用索引)。執行結果將是可怕的。

數據類型轉換的潛在解決方案是使用明確的Add方法而不是AddWithValue,該方法將數據類型作爲第二個參數。有關此here的更多詳細信息。

欲瞭解更多詳情,請您閱讀How Data Access Code Affects Database Performance

3

短參數允許對數據進行類型安全和長度檢查。啓用針對SQL注入的防禦,它們並不完全禁止SQL注入,您仍然需要檢查輸入。

SO Answer關於相似主題。

Good article解釋如何參數不防止SQL注入100%

SQL注入實例(從MSDN :)

兩者考慮會發生什麼,當用戶鍵入的SSN文本框中輸入下列字符串,這期待着一個形式爲nnn-nn-nnnn的社會安全號碼。 '; DROP DATABASE pubs -

使用輸入,應用程序將執行以下動態SQL語句或存儲過程,該語句或存儲過程在內部執行類似的SQL語句。

// Use dynamic SQL 
SqlDataAdapter myCommand = new SqlDataAdapter(
      "SELECT au_lname, au_fname FROM authors WHERE au_id = '" + 
      SSN.Text + "'", myConnection); 

// Use stored procedures 
SqlDataAdapter myCommand = new SqlDataAdapter(
           "LoginStoredProcedure '" + 
           SSN.Text + "'", myConnection); 

開發人員的意圖是,當代碼運行時,它會插入用戶的輸入並生成以下語句的SQL。

SELECT au_lname, au_fname FROM authors WHERE au_id = '172-32-9999' 

然而,代碼插入用戶的惡意輸入,併產生以下查詢。

SELECT au_lname, au_fname FROM authors WHERE au_id = ''; DROP DATABASE pubs --'

常見的方式,以避免注入攻擊。

•限制和消毒輸入數據。通過驗證類型,長度,格式和範圍來檢查已知的良好數據。

•使用類型安全的SQL參數進行數據訪問。您可以將這些參數用於存儲過程或動態構建的SQL命令字符串。參數集合(如SqlParameterCollection)提供了類型檢查和長度驗證。如果您使用參數集合,則輸入將被視爲文字值,並且SQL Server不會將其視爲可執行代碼。使用參數集合的另一個好處是您可以執行類型和長度檢查。範圍之外的值觸發異常。這是一個深度防守的好例子。

•使用在數據庫中具有受限權限的帳戶。理想情況下,您只應將執行權限授予數據庫中選定的存儲過程,並且不提供直接表訪問。

•避免泄露數據庫錯誤信息。如果發生數據庫錯誤,請確保您不會向用戶披露詳細的錯誤消息。