Mögliches Duplikat:
Kann ich mich gegen SQL Injection schützen, indem ich einfache Anführungszeichen ausklammere und Benutzereingaben mit einfachen Anführungszeichen umschließe?
Wir haben eine Legacy-Anwendung, die keine Abfragen mit Positionsparametern durchführt, und überall gibt es SQL. Es wurde beschlossen (bevor ich hier anfing), dass, da Benutzereingaben Apostrophe enthalten können, jede Zeichenkette Eingabe sollte manuell für diese Apostrophe escaped werden.
Hier ist der wesentliche Originalcode (nicht von mir geschrieben), der Einfachheit halber in C# übersetzt:
private string _Escape(string input)
{
return input.Replace("'", "''");
}
private bool _IsValidLogin(string userName, string password)
{
string sql =
string.Format
(
@"SELECT COUNT(*) FROM UserAccounts
WHERE UserName = '{0}' AND Password = '{1}'",
_Escape(userName),
_Escape(password)
);
// ...
}
Es sieht wirklich so aus, als ob es auf irgendeine Art und Weise gebrochen werden kann, aber ich weiß nicht, wie es durch Benutzereingaben ausgenutzt werden könnte. Angenommen, die Benutzereingabe ist ungefiltert, bis sie auf _IsValidLogin
und vergessen, dass Kennwörter offenbar im Klartext gespeichert werden.
Die Lösung liegt auf der Hand - Verwendung von Positionsparametern - aber ich brauche Munition, um dem Management zu zeigen, warum/wie dieser Code unsicher ist, damit Zeit/$ für die Behebung bereitgestellt werden kann.
Anmerkung: Ich bin unter der Annahme, dass dies kann gebrochen werden, aber das muss nicht der Fall sein. Ich bin kein SQL-Superstar.
Anmerkung 2: Ich habe diese Frage als datenbankunabhängig formuliert, aber wenn Sie diesen Code für eine bestimmte Engine ausnutzen können, begrüße ich Ihren Beitrag.