| 

.NET C# Java Javascript Exception

1
Hi Leute,
wie verhindere ich Sql Injection in .net?
Die Methode mit Parametern ist mir bekannt!(Code von MSDN)

using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet userDataset = new DataSet();
SqlDataAdapter myDataAdapter = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id",
connection);
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
myDataAdapter.Fill(userDataset);
}

Kann ich dadurch aber wirklich 100% sicherstellen, dass keine Sql Injection in meinem dynamischen Query ausgeführt werden kann?

Falls nein, könnte jemand ein Beispiel posten wie es trotzdem möglich ist? Will nämlich sichergehen dass mir meine Daten erhalten bleiben ;)
Gibt es noch weitere Möglichkeiten als mit Parametern zu arbeiten?

Grüße Maxx
16.09.2009
Maxx 63 1 4
3 Antworten
1
Zuerst möchte ich sagen, das sich das binden in einer Zeile erledigen läßt.

using (SqlConnection connection = new SqlConnection(connectionString)){
DataSet userDataset = new DataSet();
SqlDataAdapter myDataAdapter = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id",
connection);
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11).Value = SSN.Text;
myDataAdapter.Fill(userDataset);
}


Das resultierende SQL-Statement aus dem oberen Anweisung wenn ich annehme, das SSN.Text den Wert "Test'SQL" im ersten Beispiel, und den Wert "Test''SQL" im zweiten Beispiel hat:

//@au_id = Test'SQL
exec sp_executesql N'SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id',
N'@au_id varchar(100)', @au_id = 'Test''SQL'
//@au_id = Test''SQL
exec sp_executesql N'SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id',
N'@au_id varchar(100)', @au_id = 'Test''''SQL'


Wie man sieht, kümmert sich das ADO.Net um das escapen und nicht der SQL-Server. Von daher bist du von der Implementeriung des ADO.Net abhängig. Wenn die einen Fehler hat, wird es möglich trotz binden eine SQL-Incetion auszuführen. Mir sind jedoch keine Fehler bekannt und rückblickend betrachtet hatte das .net Framework auch nicht viel Sicherheitsprobleme.
Bin ist von daher als sicherste Methode anzusehen, SQL-Injection zu verhinden.
16.09.2009
Floyd 14,6k 3 9
Floyd 14,6k 3 9
2
Das ist schon mal nicht schlecht und wird im allgemeinen als sicher betrachtet.

Es gibt eine Entwickler Security Serie die das Thema näher untersucht, z.B. hier Schwachstellen-Suche: SQL-Injection 2. Ordnung und die Verweise auf dieser Seite sollten ausreichend Klärung liefern.
16.09.2009
me 1,1k 2 9
1
In PHP habe ich mir mal eine Funktion Programmiert die Get und Post Anfragen mit einer RegExp auf Sachen wie "union%20" ";" "system" und ähnliche Sachen prüft und das Abarbeiten unterbricht. Man kann das auch Webserver seitig lösen, dazu gibt es Layer 7 Firewalls wie mod_security. Aber das führt jetzt zu weit. Und das sicherste ist sowisso eine saubere Programmierung.

Man sollte auch eine Prüfung für jeden Parameter Programmieren um, Anhand einer RegExp, die Parameter auf Fehleingaben zur überprüfen (und das nicht nur Clientseitig per JS). Beispielsweise sollte der Parameter id nur Zahlen annehmen die 1-8 Stellen haben. Eine Perl oder PHP RegExp wäre "[0-9]{1,8}". In .net übernimmt Regex.IsMatch das Matchen von Strings und sollte ungefähr so gehen mit dem id Beispiel:

Regex.IsMatch (strIn,("^([0-9]{1,8})")


Vergiss auch nicht deine SQL Statements abzuschliessen mit einem ";" damit man per URL nicht einfach etwas anhängen kann.
17.09.2009
Lord_Pinhead 778 1 8
Danke für den letzten Tipp mit dem ;
Maxx 13.11.2009

Stelle deine Sql-Frage jetzt!