作为 SQL 参数的 C# DataTable 的安全性
Safety of C# DataTable as SQL Parameter
我最近读了很多关于 SQL 注入的文章,我知道 SqlParameter
肯定不会阻止注入,但是 table 参数和单个参数一样安全吗?
一些未经测试的未编译示例代码以供说明:
这是...
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();
我确实尝试搜索它,但找不到好的输入。任何人都可以 link 我在正确的方向吗?
提前致谢
类型化参数将阻止 SQL 注入,如果它们不可能被解释为文字命令并执行的话。无论它们是作为标量还是作为 table 值参数传输,在这方面都没有任何区别。
我最近读了很多关于 SQL 注入的文章,我知道 SqlParameter
肯定不会阻止注入,但是 table 参数和单个参数一样安全吗?
一些未经测试的未编译示例代码以供说明:
这是...
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();
我确实尝试搜索它,但找不到好的输入。任何人都可以 link 我在正确的方向吗?
提前致谢
类型化参数将阻止 SQL 注入,如果它们不可能被解释为文字命令并执行的话。无论它们是作为标量还是作为 table 值参数传输,在这方面都没有任何区别。