Kann ich alle SQL-Injection-Angriffe mithilfe von Parametern vermeiden?

8

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?

    
Mohamad Alhamoud 17.09.2010, 15:44
quelle

6 Antworten

10

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.

    
RedFilter 17.09.2010, 15:46
quelle
9

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.

    
Adam Robinson 17.09.2010 15:49
quelle
5

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:

  • Ihr App-Code ruft eine gespeicherte Prozedur oder dynamisches SQL in der Datenbank auf. Das muss Parameter verwenden, um alle Werte zu übergeben.
  • Die gespeicherte Prozedur oder dynamisches SQL erstellt intern einen Aufruf einer anderen gespeicherten Prozedur oder dynamischen SQL-Anweisung. Das muss auch Parameter verwenden, um alle Werte zu übergeben.
  • Wiederholen Sie ad-infinitum, bis Sie keinen Code mehr haben.

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.

    
Christian Hayter 17.09.2010 16:11
quelle
2

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.

    
Denis Valeev 17.09.2010 15:48
quelle
1

Sie können das Risiko einer SQL-Injektion immer minimieren, indem Sie vorbereitete Anweisungen verwenden, sofern Ihre Datenbank-Engine diese unterstützt.

Auf jeden Fall sind vorbereitete Anweisungen die sicherste Art, SQL-Injektionen zu blockieren.

    
polemon 17.09.2010 15:55
quelle
1

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).

    
Thomas Mueller 17.09.2010 16:56
quelle

Tags und Links