2017-09-12 1 views
2

j'ai lu beaucoup de choses sur les injections SQL ces derniers temps et je sais un SqlParameter n'empêchera pas des injections sûr, mais est un paramètre de table aussi sûr qu'un seul paramètre?de sécurité C# SQL DataTable comme paramètre

quelques exemples de code non compilé non testé pour la clarification:

... Est-ce

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

aussi sûr que cela?

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

J'ai vraiment essayé de chercher, mais je ne peux pas trouver la bonne entrée. Quelqu'un peut-il me relier dans la bonne direction?

Merci à l'avance

+0

Vous avez déclaré un type sur la table déjà. Si vous voulez que ce soit encore plus fort, passez les noms des champs au lieu de 'select * 'et utilisez' WITH SCHEMABINDING' –

Répondre

3

paramètres typées empêcheront l'injection SQL s'il n'y a pas de possibilité qu'ils s'interprétées comme des commandes littérales et exécutées. Qu'ils soient transportés en tant que paramètres scalaires ou de table, cela ne fait aucune différence à cet égard.