2017-06-19 4 views
1

Beispielcode von DAL:Ist diese Art der Ausführung von SQL Injection sicher?

Ich verwende C# und SQL Server als Datenbank.

schrieb ich Singletons von Datenbankobjekt, und Beispiel Funktion, die Prozedur von MSSQL exceute, DbCommand und Datenbank-AddInParameter mit

ich Themen gefunden, die über parametes und SQL-Injection spricht aber ich darüber wissen wollen spezifische Art und Weise

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

dank

+0

Dies ist von C# Seite in Ordnung, aber es hängt davon ab, wie Sie Ihre Prozedur aussieht. –

+1

Es hängt ganz davon ab, welche Art von Befehlen im SP gespeichert sind. In C# -Seite ist es sicher zu 'AddInParameter' zu verwenden, aber in SQL-Seite kann eine andere Sache sein, wenn es dynamische Abfrage mit String-Verkettung enthält. –

+0

Also solange ich String-Verkettung nicht als Abfrage verwenden, ist es sicher vor SQL-Injektion? @TetsuyaYamamoto –

Antwort

1

Das dbo.Example Verfahren kann auf jeden Fall noch eine qu ausführen ery, die nicht sicher ist, zum Beispiel:

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

Sichere Code verwendet proc-Parameter in einer Abfrage genau als Parameter

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

Korrigieren Sie, @Or müssen Sie sowohl die Methode zum Aufrufen der Prozedur (der C# -Code, den Sie haben, ist aus dieser Perspektive sicher), sondern auch, wie die gespeicherte Prozedur diese Variablen verbraucht. Zwei Schlüsselprinzipien: alles parametrisieren und potenziell gefährliche Variablen nicht mit sauberen Abfragen mischen. – pcdev

+0

1. Was meinst du mit "saubere Abfragen"? 2. Wenn ich das obige Verfahren nicht als Zeichenfolge mit 'exec (@cmd)' ausführen und normal ausführen werde, ist es sicher? 'proc dbo.Example (@pName varchar (100)) als wählen some aus sometable wo Somecolumn = + @ pName' @pcdev –

+0

1. Etwas betrachtet wird "schmutzig"schaffen, wenn es in irgendeiner Weise sourced von nicht vertrauenswürdiger Eingabe. Dies bedeutet nicht nur Strings, die von einem Benutzer eingegeben werden, sondern auch Daten, die aus einer Datei, einem Datenbankfeld geladen oder von einer Website heruntergeladen werden (diese können alle kompromittiert sein). Wenn Sie nicht die vollständige Kontrolle über die Quelle der Zeichenfolge haben, dann ist es "schmutzig" und muss sehr sorgfältig behandelt werden. – pcdev