2013-07-31 53 views
0

我已經閱讀了很多關於SQL注入和許多爭論爲什麼你應該避免構建查詢動態的東西用明碼/串連您cs.file內動態生成的查詢和SQL注入和DLL的文件

然而,我有問題,我需要一些比我更有經驗的人的建議。

我創建了一些DLL文件,以便在不同的項目中重新使用我的代碼,因此我在考慮泛型。

我創建了這些DLL文件,其中包含以動態方式+語句連接構建SQL查詢的所有邏輯/代碼。之後,我將這些DLL文件作爲參考添加到我的項目中。

這將容易受到SQL注入?程序不足(耗時/維護不足)?

任何意見,將不勝感激。

+0

我猜你的問題開始時F.E.表或字段是這樣動態的:'string sql =「SELECT」+ sColumns +「FROM」+ sTableName;'?你不能參數化表格名稱。建議在這些情況下使用sp_exectutesql。 – Koryu

回答

0

如果您未處理傳遞給查詢(在運行時構建)的輸入,那麼您很容易受到SQL注入的影響。添加到DLL或沒有沒有任何區別。

要解決這個問題,您需要使用參數化查詢。它們具有安全性的多重優勢。

我現在能想到的一個原因是你有一個文本框。和您的查詢是

"select * from table1 where name = '" + textbox1.Text; 

不是讓我們假設在TextBox1中用戶輸入Ehsan's。你的查詢會很快,甚至不會執行。參數化查詢的

"select * from table1 where name = @Name" 
yourCommand.Parameters.AddWithValue("@Name", textbox1.Text); 
+0

「處理我的輸入」?例如,通過在我的輸入上添加一些驗證規則? – michaalis

+0

是的,您需要驗證您的輸入是否有黑客可能執行的所有可能的惡意行爲。或者簡單地使用存儲過程或參數化查詢來確保參數獲得正確的值。 – Ehsan

+0

謝謝Ehsan,但是我可以用包括動態SQL查詢的DLL文件替換參數化查詢和存儲過程嗎?並保持安全? – michaalis

0

我們很難確切地知道,但如果你這樣做

string sql = "SELECT Field FROM Table WHERE Field = " + Somevar; 

那麼你是開放的SQL注入,如果somevar來自某種輸入(通常是用戶輸入)。

就是沒有理由這樣做,你可以做

string sql = "SELECT Field FROM Table WHERE Field = @myvar" 
0

你應該確保你正在使用參數化查詢或存儲過程等

,並避免使用動態SQL查詢等作爲

"SELECT * FROM Users WHERE UserID = " + UserID 

,因爲這些都容易受到SQL注入

而不是使用參數化查詢或存儲過程,例如

"SELECT * FROM Users WHERE UserID = @UserID" 

大多數ORM(例如,NET的實體框架)將提供對SQL注入一些保護(但只如果使用得當)

此鏈接詳細介紹了http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html

+0

因此,據我所知,我不能用包括動態SQL查詢在內的DLL文件替換參數化查詢和存儲過程?保持安全:) – michaalis

+0

如果你爲dll文件編寫代碼,那麼我看不出有什麼理由爲什麼你不能 – user1321471