Kann ich alle SQL-Injection-Angriffe mithilfe von Parametern vermeiden?
Und machen Sie sich in diesem Fall keine Gedanken über SQL Injection?
Oder gibt es einige Arten dieser Angriffe, die seitens des Programmierers mehr Sorgfalt erfordern?
Nein, Sie können nicht alle SQL-Injection-Angriffe vermeiden, indem Sie Parameter verwenden. Dynamisches SQL ist das eigentliche Problem, und dies kann sowohl in gespeicherten Prozeduren als auch in Ihrem Anwendungscode auftreten.
Z.B. ist dies anfällig für einen SQL-Injection-Angriff: Ihre parametrisierte Abfrage übergibt einen Benutzernamen an eine gespeicherte Prozedur, und innerhalb der gespeicherten Prozedur wird der Parameter mit einem SQL-Befehl verkettet und dann ausgeführt.
Ein Beispiel für viele Arten von SQL-Injection-Angriffen finden Sie in diesem SQL-Injection-Spickzettel . Sie werden sehen, dass das einfache Entfernen von einfachen Anführungszeichen nur die Oberfläche zerkratzt und dass es viele Möglichkeiten gibt.
Ja und nein. Ja, wenn alle Ihre SQL-Anweisungen tatsächlich statisch sind und nur Parameter verwenden, sind Sie zu 100% vor SQL-Injection-Angriffen geschützt.
Das Problem tritt auf, wenn die Parameter selbst zum Erstellen dynamischer SQL-Anweisungen verwendet werden. Ein Beispiel wäre eine gespeicherte Prozedur, die dynamisch eine SQL-Anweisung generiert, um eine Vielzahl verschiedener Optionen abzufragen, bei denen eine einzige monolithische Anweisung unpraktisch wäre. Obwohl es für dieses Problem bessere Lösungen gibt, ist dies eine häufige.
Ja, Sie können alle SQL-Injection-Attacken vermeiden, indem Sie Parameter verwenden, solange Sie Parameter ausschließlich ganz unten im Call-Stack verwenden . Zum Beispiel:
Wenn Sie in SQL Server programmieren, können Sie sp_executesql
zum Ausführen von dynamic verwenden SQL, und Sie können parametrisierte Werte definieren und an die Anweisung übergeben, die gerade ausgeführt wird.
Wenn Sie eine dynamische SQL-Abfrage mit diesen Parametern erstellen (z. B. an eine gespeicherte Prozedur übergeben), besteht die Möglichkeit einer SQL-Injektion, wenn keine Vorsichtsmaßnahmen getroffen werden.
Das Problem besteht darin, die SQL-Anweisung dynamisch zu erstellen.
Sie möchten beispielsweise das Ergebnis basierend auf der vom Benutzer ausgewählten Spalte sortieren. In den meisten Datenbanken können Sie hier keine Parameter verwenden ("ORDER BY?" Funktioniert nicht). Sie müssen also "ORDER BY" + Spalte. Wenn "column" ein String ist, könnte der Benutzer Ihrer Webanwendung Code dort einfügen (was nicht einfach, aber möglich ist).
Tags und Links sql security sql-injection