将 C# DataTable 作为 SQL 参数的安全性

Safety of C# DataTable as SQL Parameter

提问人:Jan 提问时间:9/13/2017 最后编辑:marc_sJan 更新时间:9/13/2017 访问量:196

问:

我最近读了很多关于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();

我真的试图搜索它,但我找不到好的输入。谁能把我引向正确的方向?

提前致谢

C# T-SQL SQL注入

评论

0赞 Matthew Whited 9/13/2017
您已经在表上声明了一个类型。如果您希望它更强大,请传递字段名称,而不是 和select *WITH SCHEMABINDING

答:

3赞 Cee McSharpface 9/13/2017 #1

如果类型化参数不可能被解释为文本命令并执行,则它们将阻止 SQL 注入。无论它们是作为标量参数还是表值参数传输,在这方面没有任何区别。