Dennis: SQL-Injektionen verhindern, Magic Quotes deaktivieren

Beitrag lesen

Hi kleiner,

dann ist der schnipsel von mir ja nicht so anfällig wie ich gedacht hatte, oder?

Doch, dein jetziger Schnipsel ist prinzipiell genauso gefährlich wie dein vorheriger Schnipsel. Allerdings lässt dieser SQL-Query erst mal nur SELECTs zu, so dass man eigentlich nichts löschen kann. Ich sage eigentlich, weil man theoretisch folgendes an dein Script übergeben könnte:

'; DELETE FROM table WHERE 1=1; --

Das würde in folgenden SQL-Befehl resultieren:

SELECT * FROM table WHERE data1 LIKE '%'; DELETE FROM table WHERE 1=1; -- %' or data2 LIKE '%'; DELETE FROM table WHERE 1=1; -- %'

Beachte bitte, dass die Zeichenkette -- in SQL einen Kommentar einleitet, der bis zum Zeilenende geht, effektiv steht also nur noch folgendes da:

SELECT * FROM table WHERE data1 LIKE '%'; DELETE FROM table WHERE 1=1;

Das könnte dir alle Einträge aus der Tabelle table löschen, allerdings lassen aktuelle PHP bzw. MySQL-Versionen dies nicht mehr zu, d.h. pro Aufruf von mysql_query() kann nur noch ein Befehl abgesetzt werden.
Das ändert aber nichts daran, dass dies eine Sicherheitslücke ist über die du theoretisch auch Datensätze löschen kannst!!

Jetzt gibt es aber noch eine Funktion, welche dir vermutlich ins Geschehen reinpfuscht und weshalb du keine Auswirkungen von Rouvens Beispiel siehst: Magic-Quotes. Wenn magic_quotes_gpc in deiner PHP-Konfiguration aktiviert ist und du

' OR 1=1 OR 'a'='a

in das Textfeld tipst, hast du in der Variable $_POST['suche'] schlussendlich folgendes stehen:

' OR 1=1 OR 'a'='a

Also dasselbe, als wie wenn du addslashes() auf $_POST['suche'] aufgerufen hättest, sodass der SQL-Befehl am Ende so aussieht:

SELECT * FROM table WHERE data1 LIKE '%\' OR 1=1 OR \'a\'=\'a%' or data2 LIKE '%\' OR 1=1 OR \'a\'=\'a%'

und nicht so, wie Rouven es „beabsichtigt” hat:

SELECT * FROM table WHERE data1 LIKE '%' OR 1=1 OR 'a'='a%' or data2 LIKE '%' OR 1=1 OR 'a'='a%'

Jetzt magst du dir denken, dass dann ja für dich alles OK wäre - aber das ist falsch. Magic Quotes sind eine veraltete Technik und werden (steht auch auf der oben verlinkten Seite im PHP Handbuch) in zukünftigen PHP-Versionen nicht mehr existieren! Das heißt mit PHP 5.3 (spätestens mit PHP 6.0) hätte dein Script dann mit Sicherheit eine richtige[TM] Sicherheitslücke!

Was du jetzt tun sollst? Magic Quotes deaktivieren und die Eingaben des Besuchers richtig behandeln.

Viele Grüße,
  ~ Dennis.