2017-09-12 39 views
2

我最近讀了很多關於SQL注入的知識,並且我知道SqlParameter不會確實阻止注入,但它是一個與單個參數一樣安全的表參數嗎?C#DataTable作爲SQL參數的安全性

澄清一些未經測試的未編譯的示例代碼:

這是...

SQL:

CREATE PROCEDURE dbo.InsertSingle 
    @Name nvarchar(max), 
    @Phone nvarchar(max) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO FooBar.dbo.SomeTable 
    VALUES(@Name, @Phone) 
END 
GO 

C#:

foreach(User u in Users) 
{ 
    Connection.Open(); 

    SqlCommand com = Connection.CreateCommand(); 
    com.CommandType = CommandType.StoredProcedure; 
    com.CommandText = "dbo.InsertSingle"; 

    SqlParameter p = new SqlParameter("@Name", u.Name); 
    com.Parameters.Add(p); 

    p = new SqlParameter("@Phone", u.Phone); 
    com.Parameters.Add(p); 

    com.ExecuteScalar(); 
} 

安全的,因爲這個?

SQL:

CREATE PROCEDURE dbo.InsertBunch 
    @ValuesAsTable dbo.ValuesAsTableType READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO FooBar.dbo.SomeTable 
     SELECT * 
     FROM @ValuesAsTable 
END 
GO 

C#:

DataTable valuesAsTable = Users.GetSomeInsertData(); 
Connection.Open(); 

SqlCommand com = Connection.CreateCommand(); 
com.CommandType = CommandType.StoredProcedure; 
com.CommandText = "dbo.InsertBunch"; 

SqlParameter p = new SqlParameter("@valuesAsTable", valuesAdTable); 
p.SqlDbType = SqlDbType.Structured; 
p.TypeName = "dbo.ValuesAsTableType"; 
com.Parameters.Add(p); 

com.ExecuteScalar(); 

我真的試圖尋找它,但我不能找到很好的輸入。任何人都可以在正確的方向連接我嗎?

在此先感謝

+0

你已經在表格上聲明瞭一個類型。如果你希望它更強大的話,傳遞字段名稱而不是'select *'並使用'WITH SCHEMABINDING' –

回答

3

類型的參數可以防止SQL注入,如果沒有可能性,他們得到解釋爲文字的命令,並執行。無論它們是作爲標量還是表值參數傳輸,在這方面沒有任何區別。