2017-05-08 56 views
-2

我現在讀了很多關於SQL注入並試圖阻止它。我已經遇到了幾篇文章關於如何以及爲什麼使用Command.Parameters.Add()如何防止SQL注入? C#

Command.Parameters.Add() 

like explained here

但我仍在尋找一個答案如何以及爲什麼它是防止SQL注入。

MSDN對此沒有太多的信息。

下面是一個例子,我如何使用它:

SqlCommand myCommand = new SqlCommand("SELECT * FROM table WHERE name = @name ", myConnection); 
myCommand.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = "MaMu2"; 

是我的代碼甚至對SQL注入安全的,還是我錯了?

編輯:主要問題是:它如何在內部工作?

+0

是的,你的代碼是針對SQL注入安全受到黑客攻擊。 – Steve

+0

第二個問題的答案在這裏給出:http://stackoverflow.com/questions/4892166/how-does-sqlparameter-prevent-sql-injection –

回答

0

簡短版本: 基本上,sql引擎提示sql參數作爲值的佔位符。
這意味着,即使你的@Name參數會name';drop table tableName;--你結束了這樣的查詢:

SELECT * FROM table WHERE Name = 'name'';drop table tableName;--' 

至於並列,如果你將不得不連接字符串創建SQL - 這將創建這樣一個查詢:

SELECT * FROM table WHERE Name = 'name';drop table tableName;-- 

正如你所看到的,第一個查詢是安全的,而第二個查詢是不安全的。它允許你添加有害的代碼到你的sql。

雖然如果您使用的是參數,那麼您的有害代碼將不會被視爲代碼。
重要注意事項:如果要將參數發送到使用這些參數創建和運行動態sql的存儲過程,則仍然不安全 - 因爲它在存儲過程內連接了字符串。

作爲一個方面說明,一些數據庫引擎,如甲骨文將只允許一個命令,分別執行,但仍然可以使用name' OR 1=1,將創建

SELECT * FROM table WHERE Name = 'name' OR 1=1