Wir haben hier eine weitere Diskussion über die Verwendung parametrisierter SQL-Abfragen in unserem Code. Wir haben zwei Seiten in der Diskussion: Ich und einige andere, die sagen, wir sollten immer Parameter verwenden, um uns vor SQL-Injektionen zu schützen, und die anderen, die es nicht für notwendig halten. Stattdessen möchten sie einzelne Apostrophe durch zwei Apostrophe in allen Zeichenfolgen ersetzen, um SQL-Injektionen zu vermeiden. Auf unseren Datenbanken wird Sql Server 2005 oder 2008 ausgeführt, und auf unserer Codebasis wird .NET Framework 2.0 ausgeführt.
Lassen Sie mich Ihnen ein einfaches Beispiel in C # geben:
Ich möchte, dass wir dies verwenden:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Während die anderen das machen wollen:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Wo die SafeDBString-Funktion wie folgt definiert ist:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Solange wir SafeDBString für alle Zeichenfolgenwerte in unseren Abfragen verwenden, sollten wir jetzt sicher sein. Richtig?
Es gibt zwei Gründe, die SafeDBString-Funktion zu verwenden. Erstens ist es so, wie es seit der Steinzeit gemacht wurde, und zweitens ist es einfacher, die SQL-Anweisungen zu debuggen, da Sie die exakte Abfrage sehen, die in der Datenbank ausgeführt wird.
Also dann. Meine Frage ist, ob es wirklich ausreicht, die SafeDBString-Funktion zu verwenden, um SQL-Injection-Angriffe zu vermeiden. Ich habe versucht, Beispiele für Code zu finden, der diese Sicherheitsmaßnahme verletzt, aber ich kann keine Beispiele dafür finden.
Gibt es da draußen jemanden, der das brechen kann? Wie würdest du es machen?
EDIT: Um die bisherigen Antworten zusammenzufassen:
- Bisher hat noch niemand einen Weg gefunden, um SafeDBString auf SQL Server 2005 oder 2008 zu umgehen. Das ist gut, denke ich?
- In mehreren Antworten wurde darauf hingewiesen, dass Sie bei Verwendung parametrisierter Abfragen einen Leistungsgewinn erzielen. Der Grund ist, dass die Abfragepläne wiederverwendet werden können.
- Wir sind uns auch einig, dass die Verwendung parametrisierter Abfragen besser lesbaren Code liefert, der einfacher zu warten ist
- Außerdem ist es einfacher, immer Parameter zu verwenden, als verschiedene Versionen von SafeDBString, Konvertierungen von Zeichenfolgen in Zahlen und Konvertierungen von Zeichenfolgen in Datumsangaben zu verwenden.
- Wenn Sie Parameter verwenden, erhalten Sie eine automatische Typkonvertierung. Dies ist besonders nützlich, wenn Sie mit Datums- oder Dezimalzahlen arbeiten.
- Und schließlich: Versuchen Sie nicht, selbst Sicherheit zu leisten, wie JulianR schrieb. Die Datenbankanbieter investieren viel Zeit und Geld in die Sicherheit. Es gibt keine Möglichkeit, es besser zu machen, und keinen Grund, warum wir versuchen sollten, ihre Arbeit zu erledigen.
Obwohl niemand in der Lage war, die einfache Sicherheit der SafeDBString-Funktion zu beeinträchtigen, habe ich viele andere gute Argumente erhalten. Vielen Dank!