Format-Funktion vs. Parameter in SQL-Injection-Szenarien?

7

Ich weiß über die Verwendung von Parametern in SQL-Sätzen, aber nur aus Neugier ist sicher, die Format-Funktion zu verwenden, um SQL-Injektionen anstelle von Parametern zu verhindern.

gefällt dieses Beispiel

%Vor%     
Salvador 20.06.2012, 21:05
quelle

3 Antworten

11

Das wäre wahrscheinlich sicher gegen SQL-Injection, wenn QuotedStr wie erwartet funktioniert und es keine Kantenfälle gibt, die es brechen können. (Das ist keineswegs garantiert. Wie Linas in einem Kommentar darauf hingewiesen hat, lässt MySql \' verwenden, um Anführungszeichen zu umgehen. Andere DBMS haben wahrscheinlich ähnliche Fähigkeiten. Ein Angreifer mit genügend theoretischem Wissen über das System könnte sie ausnutzen .)

Aber selbst wenn QuotedStr gut genug ist, ist es immer noch besser, Parameter aus einem anderen Grund zu verwenden: Performance. Wenn Sie Ihre Parameter von Ihrer Abfrage trennen, können Sie den gleichen Abfragecode mehrere Male mit verschiedenen Parametern senden. Wenn Sie das tun, kann die Datenbank einen Großteil der Arbeit, die sie bei der Berechnung der Abfrage leistet, zwischenspeichern, so dass Ihr DB-Zugriff schneller wird. Das funktioniert nicht (oder zumindest nicht so gut), wenn Sie die Parameter in den Abfragecode selbst mischen.

    
Mason Wheeler 20.06.2012, 21:14
quelle
5

Jedes Mal, wenn Sie eine SQL-Zeichenfolge erstellen, indem Sie Zeichenfolgen miteinander verketten, besteht die Gefahr eines Injektionsangriffs, unabhängig davon, wie sicher der Zugriff auf diese Zeichenfolgen ist. Nach allem, was Sie wissen, könnte jemand Ihre App in einem Debugger ausführen, einen Breakpoint auf das Ergebnis von QuotedStr() setzen und seinen Inhalt ändern, bevor Format() ihn sehen kann.

Die Verwendung von SQL-Parametern ist der sicherste Weg. Es vermeidet nicht nur Injektionen, sondern erlaubt auch der SQL-Engine, zu entscheiden, wie die Parameter am besten für ihre eigenen Bedürfnisse formatiert werden, so dass Sie sich keine Gedanken über die Formatierung der Werte in Ihrem eigenen Code machen müssen Sprachen (wie Delphi). Ganz zu schweigen von den Leistungsvorteilen, dass Sie die SQL-Anweisung auf der Serverseite im Voraus vorbereiten können, bevor Sie sie dann in Ihrem Code mehrmals ausführen, wodurch der Datenverkehr zwischen Client und Server drastisch reduziert und die Gesamtleistung erhöht wird.

> %Vor%     
Remy Lebeau 20.06.2012 22:11
quelle
5

Nein, Format bietet keine Sicherheit vor SQL-Injection. Es unterscheidet sich in dieser Hinsicht nicht von der normalen String-Verkettung.

Der Teil des Codes in der Frage, der etwas gegen die SQL-Injektion tut, ist der Aufruf von QuotedStr , den Sie mit oder ohne Format verwenden können. Es ist jedoch nicht so zuverlässig wie echte parametrisierte Abfragen.

Der einzige Vorteil von Format in diesem Kontext besteht darin, dass die gesamte Zeichenfolgemaske an einer Stelle ist. Daher ist es weniger wahrscheinlich, dass Abstände und Satzzeichen falsch sind, als wenn Sie die Zeichenfolge mit sukzessive% erstellen müssten. co_de% -Operationen, wobei die SQL-Apostrophe unter den Delphi-Apostrophen verloren gehen könnten.

    
Rob Kennedy 21.06.2012 04:04
quelle

Tags und Links