Es ist fast schon etwas beschämend, dass so viele erfolgreiche SQL Injection-Angriffe auftreten, da es eigentlich EXTREM einfach ist, SQL Injection-Schwachstellen zu vermeiden.
SQL Injection-Fehler treten auf, wenn Softwareentwickler dynamische Datenbankabfragen erstellen, die vom Benutzer bereitgestellte Eingaben enthalten. Das Vermeiden von SQL-Injection-Fehlern ist tatsächlich einfach. Entwickler haben dazu 2 Optionen:
1) keine dynamische SQL-Queries schreiben
2) Keinen Input zulassen der Befehle enthält
Wenn die erste Option nicht möglich ist, dann gibt es folgende Möglichkeiten zur Prävention von SQL-Injection:
Verwenden von Prepared Statements (mit Variable-Binding)
Hier wird eine sichere API verwendet, die es einem Angreifer nicht erlaubt, den SQL-Interpreter auszutricksen. Anstatt den Query-String zusammen zu bauen durch Strinkonkatenation, werden die einzelnen Bestandteile sicher an die API übergeben.
Verwenden von Stored Procedures
Hier wird die SQL-Abfrage direkt auf der DB abgelegt und man ruft sie nur noch auf mit den Parametern. Auch hier kann man nicht so leicht den SQL-Interpreter austricksen.
Whitelisting von Eingabeparametern
Das ist ein Filter mit erlaubten Zeichen, bei denen man gefährliche Zeiten wie Anführungszeichen oder Semikolon nicht mit aufnimmt. Dadurch wird es für Angreifer sehr schwer, einen wirksamen Angriffsvektor zu erstellen.
Escaping aller Eingaben
Gefährliche Zeichen können vor dem Übergeben an den SQL-Interpreter escaped werden. Dabei werden sie durch eine harmlose Schreibweise ausgedrückt, so dass sie nicht als Kommando interpretiert werden.
Habt Ihr noch auf dem Schirm, wie man das Ganze am besten anwendet? Falls nicht, dann möchte ich nochmal auf unser Secure Coding Workbook verweisen, wo man das ganz schnell nachschlagen kann.