2016-05-13 14 views
0

In einer vorhandenen Codebasis gibt es hardcoded SQL und ich möchte SQL-Injektion vermeiden.Wie SqlParameter in SELECT SqlCommand ersetzt werden?

Der folgende Code verwendet SqlCommand zusammen mit SqlParameters. Die Abfrage gibt keine Daten zurück. Wenn ich jedoch die Parameter entferne, gibt die Abfrage die richtigen Ergebnisse zurück.

Wie kann ich SqlParameters mit einer SELECT-Anweisung verwenden?

 string atUsername = "@username"; //does not work 
     //string atUsername = "Demo1"; //THIS WORKS 
     string atPassword = "@password"; //does not work 
     //string atPassword = "222"; //THIS WORKS 
     string sql = @"SELECT userId, userName, password, status, roleId, vendorId 
     FROM users 
     WHERE username = '" + atUsername + "' AND password = '" + atPassword + "'"; 

     SqlCommand cmd = new SqlCommand(sql); 

     cmd.Parameters.Add(atUsername, SqlDbType.NVarChar, 20); 
     cmd.Parameters[atUsername].Value = "Demo1"; 
     //cmd.Parameters.AddWithValue //also does not work 


     cmd.Parameters.Add(atPassword, SqlDbType.NVarChar, 20); 
     cmd.Parameters[atPassword].Value = "222"; 
     //cmd.Parameters.AddWithValue //also does not work 

     SqlConnection conn = new SqlConnection(connStr); 
     cmd.Connection = conn; 
     conn.Open(); 

     SqlDataAdapter sda = new SqlDataAdapter(cmd); 
     DataTable dt = new DataTable(); 
     sda.Fill(dt); 

     Console.WriteLine(dt.Rows != null); 
     if (dt.Rows != null) 
     { 
      Console.WriteLine(dt.Rows.Count); 
     } 

     conn.Close(); 
     conn.Dispose(); 

Ich habe auch erfolglos versucht, Alternativen mit

  1. SqlCommand.ExecuteReader und SqlDataReader
  2. IDisposable Muster
  3. ersetzen cmd.Parameters.Add(atUsername mit

    SqlParameter pUsername = new SqlParameter(); pUsername.ParameterName = atUsername; pUsername.Value = "Demo1"; cmd.Parameters.Add(pUsername);"

PS. Ich habe von EntityFramework gehört, aber ich kann EF in diesem Fall nicht verwenden (lange Geschichte).

+2

Entfernen Sie die Umhüllung um Variablennamen. ... = '@username' <- falsch. ... = @username <- richtig. – Evk

+0

Warum hast du es nicht als Antwort angegeben? @Evk – niksofteng

+0

@nikhilvartak Nicht gewöhnt sich noch, um so kleine Dinge wie Antworten zu setzen :) – Evk

Antwort

3

Die Wurzel des Problems ist, dass Sie innerhalb Zeichenfolge Variablennamen verwenden wörtliche:

WHERE username = '@username' AND password = '@password' 

So werden sie nicht als Variablennamen von SQL Server behandelt. Stattdessen suchen Sie nach einem Benutzer mit dem Namen "@username" und dem Passwort "@password". Der richtige Weg ist:

WHERE username = @username AND password = @password