簡體   English   中英

C#數據表作為SQL參數的安全性

[英]Safety of C# DataTable as SQL Parameter

我最近閱讀了很多有關SQL注入的信息,並且我知道SqlParameter不能肯定地阻止注入,但是表參數和單個參數一樣安全嗎?

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

這是...

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();

我確實嘗試搜索它,但是找不到很好的輸入。 誰能以正確的方向聯系我?

提前致謝

如果無法將類型的參數解釋為文字命令並執行,則類型化的參數將阻止SQL注入。 無論將它們作為標量還是表值參數進行傳輸,在這方面都沒有任何區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM