Zu Beginn bin ich mir bewusst, dass parametrisierte Abfragen die beste Option sind, aber ich frage mich, was die unten dargestellte Strategie anfällig macht. Die Leute bestehen darauf, dass die unten stehende Lösung nicht funktioniert, deshalb suche ich nach einem Beispiel dafür, warum dies nicht der Fall ist.
Welche Art von Injection kann dies verhindern, wenn dynamisches SQL mit dem folgenden Escapezeichen in Code eingebaut wird, bevor es an einen SQL Server gesendet wird?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
Eine ähnliche Frage wurde hier beantwortet , aber ich glaube nicht, dass eine der Antworten hier zutreffend ist.
In SQL Server ist es nicht möglich, das einfache Anführungszeichen mit einem "\" zu versehen.
Ich glaube, SQL-Schmuggel mit Unicode ( hier beschrieben ) würde durch die Tatsache vereitelt, dass die erzeugte Zeichenfolge durch das N vor dem einfachen Anführungszeichen als Unicode markiert wird. Soweit ich weiß, gibt es keine anderen Zeichensätze, die SQL Server automatisch in ein einfaches Anführungszeichen übersetzt. Ohne ein einfaches Zitat glaube ich nicht, dass eine Injektion möglich ist.
Ich glaube auch nicht, dass String Truncation ein brauchbarer Vektor ist. SQL Server wird das Abschneiden sicherlich nicht durchführen, da die maximale Größe für a laut Microsoftnvarchar
2 GB beträgt . Eine 2-GB-Zeichenfolge ist in den meisten Situationen nicht und in meinen nicht möglich.
Eine Injektion zweiter Ordnung könnte möglich sein, aber ist es möglich, wenn:
- Alle Daten, die in die Datenbank gelangen, werden mit der oben beschriebenen Methode bereinigt
- Werte aus der Datenbank werden niemals an dynamisches SQL angehängt (warum sollten Sie das überhaupt tun, wenn Sie nur auf den Tabellenwert im statischen Teil einer dynamischen SQL-Zeichenfolge verweisen können?).
Ich behaupte nicht, dass dies besser als oder eine Alternative zur Verwendung parametrisierter Abfragen ist, aber ich möchte wissen, wie anfällig das, was ich skizziert habe, ist. Irgendwelche Ideen?
"SELECT * FROM MyTable WHERE Field = " + userInput
wannuserInput
ist0; DROP TABLE OhNo;
.