2011-01-12 4 views
5

Na przykład, jest to kod, który używam:jest bezpieczny przy użyciu dynamicznego SQL z parametrami? Jeśli nie, z jakimi problemami bezpieczeństwa może być narażony?

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

To jest preferowany, bezpieczny sposób na zrobienie tego (rezygnując z subtelnego błędu, którego mi brakuje) – Greg

+0

niesamowite odpowiedzi! Doceniam to!! – RoundOutTooSoon

Odpowiedz

7

Ten kod wygląda dobrze. Parametryzacja jest drogą do zrobienia, w przeciwieństwie do konkatenacji wartości dostarczanych przez użytkownika w adhoc instrukcji SQL, która może otworzyć cię do ataków typu sql injection. Może to również pomóc w ponownym użyciu planu wykonania.

Dodam tylko, że wolę jednoznacznie zdefiniować typ danych i rozmiary parametrów. Na przykład, jeśli tego nie zrobisz, jako przykład, wszystkie wartości ciągów zostaną przekazane do bazy danych jako NVARCHAR zamiast VARCHAR. Dlatego lubię być wyraźny.

4

Jest bezpieczny przed SQL injection, ponieważ jest parametryzowane. Inne problemy związane z bezpieczeństwem, takie jak zapewnienie, że @userid nie jest sfałszowany, są oddzielnymi problemami bezpieczeństwa, które powinny zostać rozwiązane w innych warstwach aplikacji.

2

To wciąż statyczny ciąg zapytania. To naprawdę nie jest „dynamiczny” sql aż również zbudować części napisu na bieżąco — coś takiego:

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

ale i tak jest to nadal „bezpieczny” w sql sensie wtryskowego jak długo kontynuować używać parametrów dla każdej części zapytania, która pochodzi od danych wprowadzonych przez użytkownika.

Powiązane problemy