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();
我真的試圖尋找它,但我不能找到很好的輸入。任何人都可以在正確的方向連接我嗎?
在此先感謝
你已經在表格上聲明瞭一個類型。如果你希望它更強大的話,傳遞字段名稱而不是'select *'並使用'WITH SCHEMABINDING' –