2013-10-11 72 views
3

首先我發現了幾個類似的主題,但並未完全回答我的所有問題。參數的安全性如何,完全保護您的數據庫的最佳方式是什麼

我的第一個問題,如果我用這樣的代碼:

MySqlCommand cmd = new MySqlCommand("SELECT `productnummer`, `NAAM`, `TYPE` `OMSCHRIJVING`, `Product-ID`, `Barcode` FROM `orders`.`producten` where (`productnummer` like(@variable) or `naam` like @variable or `type` like @variable or `omschrijving` like @variable or `product-id` like @variable or `barcode` like @variable) "and `uit assortiment` = 0"); 
cmd.Parameters.Add(new MySqlParameter("@variable", '%' + textBox1.Text + '%')); 

如何參數是安全的,如果我能(據我所知是一個SQL語法)定義我用SQL%變量,。 這不是說如果用戶輸入%或*或他們自己的東西,它會工作嗎?

我的第二個問題:

MySqlCommand cmd = new MySqlCommand("SELECT `user-id` FROM `orders`.`werknemers` WHERE username = @username and `password` = @password"); 
      cmd.Parameters.Add(new MySqlParameter("@username", username)); 
      cmd.Parameters.Add(new MySqlParameter("@password", password)); 

,如果我有一個包含用戶名和密碼(密碼哈希明顯)的表的數據庫。 我的應用程序有一個文本框,用戶可以在其中輸入用戶名和密碼。如上所示,密碼將被散列並且這些數據將被髮送到數據庫。 如果數據庫返回一個用戶ID,我知道這個用戶存在,我可以使用用戶ID進一步溝通,如果沒有很好的東西顯然在錯誤的

中鍵入這是一種安全的方式來做到這一點?或者有更好的方法嗎?

一般來說,這一切都歸結爲: 什麼是最安全的方式與c#中的數據庫通信?

+0

對我來說很好 – musefan

+0

你做得對。準備好的帶參數的語句可以防止任何類型的SQL注入 –

+0

如果您有兩個問題,請發佈兩個問題。 –

回答

1

你需要看一下問題的根源在查詢安全:非參數化查詢當前的威脅,因爲該數據是最終用戶插入他們作爲字符串被在編程語言重新演繹的代碼(即, SQL中的代碼)。參數化查詢會阻止這種情況發生:解釋以查詢參數的聲明結束。無論插入哪個參數,都會將其解釋爲普通的字符序列。它永遠不會成爲SQL解釋器(除非你嚴重錯誤地使用SQL的exec工具,你應該永遠不要使用接近最終用戶輸入的數據的數據)。

就散列密碼而言,不,你的代碼不安全。它對離線攻擊是開放的,因爲你的哈希不是被醃製的。但這是一個subject of a separate answer

相關問題