Das ist nicht worum es bei SQL Injection geht. Jedes Mal, wenn Sie Parameter verwenden, die in Ihrer SQL-Abfrage nicht bereinigt wurden, lassen Sie Ihre Datenbank offen für SQL-Injection, was nicht unbedingt das Ziel hat, Daten zu zerstören. Es könnte auch darum gehen, Daten zu stehlen oder sich unbefugten Zugriff zu verschaffen.
Stellen Sie sich ein sehr eingeschränktes Konto vor, bei dem alles, was es tun könnte, SELECT
ist . Sie schreiben eine Abfrage zur Authentifizierung:
$sql = "SELECT COUNT(*) AS count
FROM users
WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
// check if returns a count of 1, if yes, log in
Bei normaler Eingabe erwarten Sie, dass die Abfrage wie folgt aussieht:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Was 1 als Zählwert zurückgeben sollte, wenn sowohl Benutzername als auch Pass übereinstimmen. Nun versucht sich ein Angreifer als Admin anzumelden. Da Sie Ihre Eingaben nicht bereinigt haben, senden sie $_POST['user']
als:admin'; --
. Die gesamte Abfrage wird zu:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Alles nach --
ist ein Kommentar, also ignoriert dies die andere Bedingung und gibt trotzdem 1 zurück. Bitte schön, Sie haben gerade einem böswilligen Benutzer Administratorzugriff gewährt. So werden einige echte Angriffe durchgeführt. Sie beginnen mit einem Konto mit geringen Privilegien und versuchen, durch Sicherheitslücken Zugang zu mehr Privilegien zu erhalten.
Lange Rede kurzer Sinn, ein anwendungsweites Konto mit eingeschränkten Rechten zu haben (zB:kein DROP
, ALTER
, etc) ist gut. Geben Sie niemals jemandem oder einer Anwendung mehr Rechte als nötig. Aber um SQL-Injection zu verhindern, verwenden Sie vorbereitete Anweisungen
.