2017-06-19 2 views
1

exemple de code de DAL:Est-ce que cette façon d'exécuter la procédure est sûre à partir de SQL Injection?

J'utilise C# et SQL SERVER comme base de données.

j'ai écrit singleton de l'objet de base de données, et par exemple la fonction que exceute procédure à partir de MSSQL, utilisant DbCommand et base de données-AddInParameter

J'ai trouvé des sujets qui parle de parametes et injection sql mais Je veux savoir à ce sujet manière spécifique

private Database m_db; 
public Database getDB 
{ 
     get 
     { 
      if(m_db == null) 
        m_db = DatabaseFactory.CreateDatabase("ConnectionString"); 
      return m_db; 
     } 
} 


public void Example(string Name) 
{ 
    DbCommand dbcmd = getDB.GetStoredProcCommand("dbo.Example"); 
    getDB.AddInParameter(dbcmd, "p_Name", DbType.String, Name); 
    getDB.ExecuteNonQuery(dbcmd); 
} 

grâce

+0

Ceci est bien d'un côté C#, bien que cela dépend comment votre procédure ressemble. –

+1

Cela dépend totalement du type de commandes stockées dans le SP. Dans le côté C#, il est sûr d'utiliser 'AddInParameter', mais du côté SQL, cela peut être différent s'il contient une requête dynamique utilisant une concaténation de chaîne. –

+0

Donc, tant que je n'utilise pas la concaténation de chaîne comme requête, il sera à l'abri de l'injection sql? @TetsuyaYamamoto –

Répondre

1

La procédure dbo.Example peut exécuter sans aucun doute encore qu rès qui n'est pas sûr, par exemple:

create proc dbo.Example (@pName varchar(100)) 
as 
    declare @cmd varchar(max); 
    set @cmd = 'select Somedata from Sometable where Somecolumn = '+ @pName; 
    exec (@cmd); 

Code Safe utilise le paramètre proc dans une requête exactement comme paramètre

create proc dbo.Example (@pName varchar(100)) 
as 
    select Somedata from Sometable where Somecolumn = @pName; 
+0

Correct, @Ou vous devez considérer à la fois la méthode utilisée pour appeler la procédure (le code C# que vous avez est sûr de cette perspective), mais aussi comment la procédure stockée consomme ces variables. Deux principes clés: paramétrer tout et ne jamais mélanger des variables potentiellement dangereuses avec des requêtes propres. – pcdev

+0

1. Que voulez-vous dire par "questions claires"? 2. Si je n'exécute pas la procédure ci-dessus comme une chaîne avec 'exec (@cmd)' et que je l'exécute normalement, ce sera sans danger? 'create proc dbo.Example (@pName varchar (100)) que sélectionnez someData de SomeTable où Somecolumn = + @ pName' @pcdev –

+0

1. Quelque chose est considéré comme "sale" si elle est de quelque façon que sourced de l'entrée non fiable. Cela signifie non seulement des chaînes entrées par un utilisateur, mais aussi des données chargées à partir d'un fichier, d'un champ de base de données ou téléchargées à partir d'un site Web (celles-ci peuvent toutes être compromises). Si vous n'avez pas un contrôle complet sur la source de la chaîne, c'est "sale" et doit être manipulé avec beaucoup de soin. – pcdev