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.
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% 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.
Tags und Links sql delphi sql-injection