studyklar
IProg · Skript 6 · Abschnitt 6

SQL-Injection: wenn Eingaben zu SQL werden

Eine Eingabe des Benutzers landet im SQL-Text, und plötzlich liefert die Datenbank alle Daten oder löscht eine ganze Tabelle. Das heißt SQL-Injection. Rechts laufen die Eingaben der Folie mit ihren Ergebnissen, berechnet mit vier Beispielzeilen. Mit Weiter geht es Schritt für Schritt voran.

Worum es geht

Skript 06, Folie 25: Problem: SQL Injection.

Bisher wurde ein Wert direkt in den SQL-Text geschrieben, etwa die Kategorie. Kommt dieser Wert vom Benutzer, kann der Benutzer mehr schicken als einen Wert. Was passiert dann?

Aus Skript 06, Folie 21: $sql = "SELECT … WHERE categoryid = '$param'"; und $erg = $db->query($sql); schicken den fertigen Text an die Datenbank.

So gehen wir vor:

  1. Wie der SQL-Text entsteht.
  2. Drei Eingaben der Folie: harmlos, alle Zeilen, kaputt.
  3. Was beim Löschen passiert.
  4. Warum das geht.
  5. Eine Klausurfrage dazu.

Der SQL-Text entsteht aus der Eingabe

Skript · Problem: SQL Injection

Betrachten Beispiel: $sql = "SELECT * FROM Product WHERE categoryid='$param'";

Im Beispiel 03_db.php kommt $param aus der Adresse, etwa 03_db.php?p=CATS. Das steht als Notiz auf Folie 24: p ist der Name des Parameters, $_GET['p'] sein Wert.

PHP setzt den Wert in Zeile 3 zwischen zwei Hochkommas (') in den Text. In SQL umschließen Hochkommas einen Text-Wert. Was in $param steht, prüft niemand: Es wird Zeichen für Zeichen hineinkopiert.

Harmlos: CATS

Eingabe:  CATS
SQL:      SELECT * FROM Product WHERE categoryid='CATS'
Ausgabe:
  FL-DSH-01:Manx
  FL-DLH-02:Persian

Mit CATS entsteht genau das gedachte SQL. Die Datenbank liefert die beiden Produkte der Kategorie CATS. „Alles ok“, sagt die Folie.

Rechts steht je Lauf die Eingabe, das entstandene SQL und die Ausgabe. Die Ausgabe macht eine Schleife wie auf Skript 06, Folie 21: je Zeile Nummer und Name. Sie ist hier nicht abgedruckt, damit der Blick auf dem SQL bleibt.

Noch 7 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1

$param = $_GET['p'];$sql =  "SELECT * FROM Product WHERE categoryid='$param'";$erg = $db->query( $sql );
LegendeZeilen des SchrittsDer Wert aus der Adresse landet direkt im SQL-Text.