So verhindern Sie SQL-Injection in PHP

Was brauche ich?

  • Jeder dedizierte oder virtuelle Server
  • Ubuntu
  • Kitt

Was ist eine SQL-Injection?

Eine SQL-Injection ist eine Technik, mit der Angreifer SQL-Abfragen in Eingabefelder einfügen, um sie dann von der zugrunde liegenden SQL-Datenbank zu verarbeiten. Diese Schwachstellen können dann ausgenutzt werden, wenn Eingabeformulare es benutzergenerierten SQL-Anweisungen ermöglichen, die Datenbank direkt abzufragen. Um Ihnen ein Beispielszenario zu geben, nehmen Sie ein typisches Anmeldeformular, das aus einem Benutzer- und E-Mail-Feld und einem Passwortfeld besteht. Nachdem die Anmeldeinformationen übermittelt wurden, werden sie mit einer SQL-Abfrage auf Ihrem Webserver kombiniert. In PHP wird der Befehl folgendermaßen geschrieben:

<?php
$query = "SELECT * FROM users WHERE username = '" . $_POST['Benutzername'] .
"'";
$query .= " AND password = '" . $_POST['password'] . "'";
?>

Es wird an den Server gesendet, um zu überprüfen, ob ihm ein gültiger Benutzername mit entsprechendem Passwort zugewiesen wurde. Ein Benutzername „xander“ mit dem Passwort „drake“ würde zu diesem Befehl führen:

SELECT * FROM users WHERE username='xander' AND password='drake'

Aber wenn sie so etwas wie „xander“;–“ eingeben würden, würde die Abfrage so aussehen:

SELECT * FROM users WHERE username='xander'; -- ' UND Passwort='Drake'

In diesem Szenario verwendet der Angreifer die SQL-Kommentarsyntax. Der verbleibende Code nach der Doppelstrichfolge (–) wird nicht ausgeführt. Das heißt, ein SQL wäre:

SELECT * FROM users WHERE username='xander';

Anschließend werden die Benutzerdaten zurückgegeben, die im Passwortfeld eingegeben wurden. Durch diesen Schritt könnte der Anmeldebildschirm umgangen werden. Ein Angreifer kann auch noch weiter gehen, indem er eine weitere Auswahlbedingung, „OR 1=1“, hinzufügt, die zu der folgenden Abfrage führt:

SELECT * FROM users WHERE username='xander' OR 1=1;

Die Abfrage gibt einen nicht leeren Datensatz für jede potenzielle Anmeldung mit der gesamten Tabellendatenbank „Benutzer“ zurück. Der obige Hack hat Ihnen eine erhebliche Sicherheitslücke einer Website aufgezeigt, aber es ist nur ein kleines Beispiel dafür, was er bewirken kann. Fortgeschrittenere Hacks ermöglichen es einem Angreifer, willkürliche Anweisungen auszuführen, die einen viel größeren Schaden anrichten. Das kann dazu führen:

  • Extraktion privater Daten wie Kreditkarten, Reisepässe, Krankenhausunterlagen,
  • Aufzählung der Authentifizierungsdaten des Benutzers, sodass diese Anmeldungen auf anderen Websites verwendet werden können,
  • eine beschädigte Datenbank, die Ausführung von Betriebssystembefehlen, gelöschte oder eingefügte Daten und zerstörte Vorgänge für die gesamte Website
  • ein vollständiger Systemkompromiss
  1. Techniken zur Verhinderung von SQL-Injection

Da Benutzereingabekanäle der Hauptvektor für solche Angriffe sind, besteht der beste Ansatz darin, Benutzereingaben zu kontrollieren und zu überprüfen, um auf Angriffsmuster zu achten. Entwickler können Schwachstellen auch vermeiden, indem sie die folgenden Hauptpräventionsmethoden anwenden.

  1. Eingabevalidierung

Der Validierungsprozess zielt darauf ab, zu überprüfen, ob die Art der von einem Benutzer übermittelten Eingaben zulässig ist oder nicht. Durch die Eingabevalidierung wird sichergestellt, dass es sich um den akzeptierten Typ, die akzeptierte Länge, das Format usw. handelt. Nur der Wert, der die Validierung besteht, kann verarbeitet werden. Es hilft dabei, allen Befehlen entgegenzuwirken, die in die Eingabezeichenfolge eingefügt werden. In gewisser Weise ist es so, als würde man vor dem Öffnen der Tür erst einmal schauen, wer klopft.

  1. Parametrisierte Abfragen

Parametrisierte Abfragen sind eine Möglichkeit, eine SQL-Anweisung vorab zu kompilieren, sodass Sie dann die Parameter angeben können, damit die Anweisung ausgeführt werden kann. Diese Methode ermöglicht es der Datenbank, den Code zu erkennen und von den Eingabedaten zu unterscheiden. Die Benutzereingaben werden automatisch in Anführungszeichen gesetzt und die bereitgestellten Eingaben führen nicht zu einer Änderung der Absicht. Daher trägt dieser Codierungsstil dazu bei, einen SQL-Injection-Angriff abzuschwächen. Es ist möglich, parametrisierte Abfragen mit der MySQLi-Erweiterung zu verwenden, aber PHP 5.1 bot einen besseren Ansatz für die Arbeit mit Datenbanken: PHP Data Objects (PDO). PDO verwendet Methoden, die die Verwendung parametrisierter Abfragen vereinfachen. Darüber hinaus ist der Code dadurch leichter lesbar und portabler, da er nicht nur auf MySQL, sondern auf mehreren Datenbanken läuft.

  1. Gespeicherte Prozeduren

Bei gespeicherten Prozeduren (SP) muss der Entwickler eine oder mehrere SQL-Anweisungen in einer logischen Einheit gruppieren, um einen Ausführungsplan zu erstellen. Nachfolgende Ausführungen ermöglichen die automatische Parametrisierung von Anweisungen. Einfach ausgedrückt handelt es sich um eine Art Code, der für später gespeichert und mehrfach verwendet werden kann. Wenn Sie also die Abfrage ausführen müssen, können Sie, anstatt sie immer wieder zu schreiben, einfach die gespeicherte Prozedur aufrufen.

  1. Flucht

Verwenden Sie immer Zeichen-Escape-Funktionen für vom Benutzer bereitgestellte Eingaben, die von jedem Datenbankverwaltungssystem (DBMS) bereitgestellt werden. Dies geschieht, um sicherzustellen, dass das DBMS es niemals mit der vom Entwickler bereitgestellten SQL-Anweisung verwechselt.

  1. Vermeiden von Administratorrechten

Verbinden Sie Ihre Anwendung nicht über ein Konto mit Root-Zugriff mit der Datenbank. Dies sollte nur erfolgen, wenn dies unbedingt erforderlich ist, da die Angreifer möglicherweise Zugriff auf das gesamte System erhalten könnten. Selbst der nicht-administrative Kontoserver kann ein Risiko für eine Anwendung darstellen, insbesondere wenn der Datenbankserver von mehreren Anwendungen und Datenbanken verwendet wird. Aus diesem Grund ist es besser, die geringsten Berechtigungen für die Datenbank zu erzwingen, um die Anwendung vor SQL-Injection zu schützen. Stellen Sie sicher, dass jede Anwendung über eigene Datenbankanmeldeinformationen verfügt und dass diese Anmeldeinformationen über die Mindestrechte verfügen, die die Anwendung benötigt. Anstatt herauszufinden, welche Zugriffsrechte Sie entziehen sollten, konzentrieren Sie sich darauf, herauszufinden, welche Zugriffsrechte oder erhöhten Berechtigungen Ihre Anwendung benötigt. Wenn ein Benutzer nur Zugriff auf einige Teile benötigt, können Sie einen Modus erstellen, der ausschließlich dieser Funktion dient.

  1. Webanwendungs-Firewall

Eine der Best Practices zur Erkennung von SQL-Injection-Angriffen ist der Einsatz einer Web Application Firewall (WAF). Eine vor den Webservern operierende WAF überwacht den ein- und ausgehenden Datenverkehr der Webserver und identifiziert Muster, die eine Bedrohung darstellen. Im Wesentlichen handelt es sich um eine Barriere zwischen der Webanwendung und dem Internet.

Eine WAF arbeitet über definierte, anpassbare Web-Sicherheitsregeln. Diese Richtliniensätze informieren die WAF darüber, nach welchen Schwachstellen und nach welchem ​​Verkehrsverhalten sie suchen soll. Basierend auf diesen Informationen überwacht eine WAF weiterhin die Anwendungen und die empfangenen GET- und POST-Anfragen, um schädlichen Datenverkehr zu finden und zu blockieren.

Der Wert einer WAF ergibt sich teilweise aus der Leichtigkeit, mit der Richtlinienänderungen durchgesetzt werden können. Neue Richtlinien können im Handumdrehen hinzugefügt werden, was eine schnelle Regelimplementierung und schnelle Reaktion auf Vorfälle ermöglicht.

Abschluss

Präventionstechniken wie Eingabevalidierung, parametrisierte Abfragen, gespeicherte Prozeduren und Escape funktionieren gut bei unterschiedlichen Angriffsvektoren. Aufgrund der großen Unterschiede im Muster von SQL-Injection-Angriffen sind sie jedoch häufig nicht in der Lage, Datenbanken zu schützen.

Wenn Sie also alle Grundlagen abdecken möchten, sollten Sie die oben genannten Strategien in Kombination mit einer vertrauenswürdigen WAF anwenden. Der Hauptvorteil von WAF besteht darin, dass es Schutz für benutzerdefinierte Webanwendungen bietet, die andernfalls ungeschützt wären.

  • Möchten Sie Vorschläge zum besten Hosting für dedizierte Server ? Klicken Sie hier und lesen Sie mehr.