2011-01-12 4 views
5

Zum Beispiel ist dies der Code, den ich verwende:ist es sicher mit dynamischem SQL mit Parametern? Falls nicht, welchen Sicherheitsproblemen könnte es ausgesetzt sein?

String commandString = "UPDATE Members SET UserName = @newName , AdminLevel = @userLevel WHERE UserID = @userid"; 
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnectionstring"].ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand(commandString, conn); 
    cmd.Parameters.Add("@newName", newName); 
    cmd.Parameters.Add("@userLevel", userLevel); 
    cmd.Parameters.Add("@userid", userid); 
    conn.Open(); 
    cmd.ExecuteReader(); 
    Reader.Close(); 
} 
+1

Das ist die bevorzugte, sichere Art und Weise es zu tun (Bare einige subtile Fehler, die ich vermisse) – Greg

+0

tolle Antworten Jungs! Bin dankbar!! – RoundOutTooSoon

Antwort

7

Dieser Code sieht gut aus. Im Gegensatz zur Verkettung von benutzerdefinierten Werten in einer Adhoc-SQL-Anweisung, die Sie für SQL-Injection-Angriffe öffnen kann, ist die Parametrisierung der richtige Weg. Dies kann auch bei der Wiederverwendung von Ausführungsplänen helfen.

Die einzige Sache, die ich hinzufügen würde, ist es, den Datentyp und die Größen der Parameter ausdrücklich zu definieren. Wenn Sie dies beispielsweise nicht tun, werden alle Zeichenfolgenwerte als NVARCHAR anstelle von VARCHAR an die Datenbank übergeben. Daher möchte ich explizit sein.

4

Es gegen SQL-Injektion sicher ist, weil es parametriert ist. Andere Sicherheitsbedenken, z. B. um sicherzustellen, dass @userid nicht gefälscht wird, sind separate Sicherheitsbedenken, die in anderen Schichten Ihrer Anwendung behandelt werden sollten.

2

Dies ist immer noch eine statische Abfragezeichenfolge.

var sql = "SELECT columns FROM Table WHERE 1=1"; 
if (!string.IsNullOrEmpty(txtName.Text)) sql += " AND Name LIKE '%' + @Name + '%'"; 
if (!string.IsNullOrEmpty(txtDesc.Text)) sql += " AND CONTAINS(DESCRIPTION, @description)"; 

Aber auch so ist dies immer noch „sicher“ in dem SQL-Injection Sinne, solange Sie weiter: Es ist nicht wirklich „dynamisch“ SQL, bis Sie auch — so etwas wie dies im Fluge Teil des Strings bauen Verwenden von Parametern für jeden Teil der Abfrage, der von Benutzereingaben stammt.

Verwandte Themen