Sie können verschiedene Maßnahmen einleiten, um SQL-Injection-Attacken auf Ihr Datenbanksystem zu verhindern. Dabei sollten Sie sich mit allen involvierten Komponenten – dem Server, den einzelnen Anwendungen sowie dem Datenbankmanagementsystem – auseinandersetzen.
Schritt 1: Die automatischen Eingaben der Applikationen überwachen
Prüfen und filtern Sie die Methoden und Parameter, die eingebundene Applikationen bei Eingaben in die Datenbank nutzen. Die übergebenen Daten sollten immer in dem erwarteten Datentyp vorliegen. Ist ein numerischer Parameter gefragt, können Sie selbigen zum Beispiel mithilfe eines PHP-Skriptes inklusive is_numeric()-Funktion überprüfen. Bei der Filterung heißt es, entsprechende Sonderzeichen zu ignorieren. Ein weiterer wichtiger Punkt ist es, dafür zu sorgen, dass die Anwendungen möglichst keine externen Fehlermeldungen ausgeben, die Informationen über das verwendete System oder die Strukturen der Datenbank verraten.
Mittlerweile gängige Praxis sind außerdem die sogenannten Prepared Statements, die Sie mit vielen Datenbankmanagementsystemen nutzen können. Diese vordefinierten Anweisungen dienten ursprünglich dazu, häufiger auftretende Abfragen auszuführen, verringern aufgrund ihrer Struktur jedoch auch das Risiko einer SQL-Injection. Denn die parametrisierten Anweisungen übermitteln den eigentlichen SQL-Befehl von den Parametern getrennt an die Datenbank. Erst das Datenbankmanagementsystem selbst führt beide im Anschluss zusammen und maskiert dabei die entscheidenden Sonderzeichen automatisch.
Schritt 2: Für einen umfassenden Server-Schutz sorgen
Die Sicherheit des Servers, auf dem Sie Ihr Datenbankmanagementsystem ausführen, spielt natürlich auch bei der SQL-Injection-Prävention eine große Rolle. An erster Stelle steht hierbei das Härten des Betriebssystems nach dem bekannten Muster:
- Installieren bzw. aktivieren Sie nur solche Anwendungen und Dienste, die für das Betreiben der Datenbank relevant sind.
- Löschen Sie alle Benutzerkonten, die Sie nicht benötigen.
- Sorgen Sie dafür, dass alle relevanten System- und Programm-Updates installiert sind.
Je höher die Anforderungen sind, die an die Sicherheit Ihres Webprojektes geknüpft sind, desto eher sollten Sie den Einsatz von Intrusion-Detection-Systemen (IDS) oder Intrusion-Prevention-Systemen (IPS) in Erwägung ziehen. Diese arbeiten mit verschiedenen Erkennungssystemen, um Angriffe auf den Server frühzeitig zu erkennen, Warnungen auszugeben und im Falle von IPS auch automatisch entsprechende Gegenmaßnahmen einzuleiten. Als sinnvolle Schutzmaßnahme kann sich außerdem auch ein Application Layer Gateway herausstellen, das den Datenverkehr zwischen Anwendungen und Webbrowser direkt auf Applikationsebene überwacht.
Schritt 3: Datenbank härten und sichere Codes verwenden
Wie auch Ihr Betriebssystem sollte die Datenbank von sämtlichen irrelevanten Faktoren befreit und regelmäßig aktualisiert werden. Entfernen Sie zu diesem Zweck alle gespeicherten Prozeduren, die Sie nicht benötigen und deaktivieren Sie alle unnötigen Dienste und Benutzerkonten. Richten Sie einen speziellen Datenbank-Account ein, der allein für den Zugriff aus dem Web vorgesehen ist und mit minimalen Zugriffsrechten auskommt. Speichern Sie ferner alle sensiblen Daten wie zum Beispiel Passwörter in verschlüsselter Form in Ihrer Datenbank.
Im Sinne der Prepared Statements ist es dringend zu empfehlen, das PHP-Modul mysql nicht zu verwenden und stattdessen mysqli oder PDO zu wählen. Auf diese Weise können Sie sich zusätzlich auch mit sicheren Codes schützen. So verhindert beispielsweise die Funktion mysqli_real_escape_string() in PHP-Skripten, dass Sonderzeichen in der ursprünglichen Form an die SQL-Datenbank übergeben werden und maskiert selbige. Wenn Sie zum Beispiel folgende Codezeilen