Tom: Escaping von SQL-Übergabewerten

Beitrag lesen

Hello,

  1. Wie könnte so ein Angriff aussehen?

Vielleicht hilft Dir eher, warum er möglich ist.

Daten, die am Client erfasst werden, werden unverändert als Parameter an das Script übertragen. PHP holt sie aus dem Environment automatisch heraus und stellt sie im Script in den bekannten Variablen

$_POST
  $_GET

usw. (die anderen unterschlage ich jetzt mal) zur Verfügung.
Wir wollen hier annehmen, dass sie immer noch unverändert sind.

Wenn Du nun ein SQL-Statement absetzt, wird dieses nicht über einen Blockbuffer abgewickelt der Variablenwerte übernimmt, sondern über eine Textschnittstelle, die das gesamte Statement inclusive der Datenwerte als Text an dee SQL-Schnittstelle DMBS weiterleitet. Erst diese trennt Befehle und Daten wieder und erzeugt die passenden internen Aufrufe.

Ein Teil des Statements ist ein Deinem Script vorgegeben, andere Teile kommen über die Parameter ins Script. Variablenwerte werden, wenn sie Texte sind, immer in Häkchen an die SQL-Schnittstelle übergeben. Das bedeutet also, dass ein Häkchen den Variablentext einleitet und ein weiteres Häkchen den Variablentext wieder beendet. Was passiert aber, wenn der Variablentext selber ein Häkchen enthält? Dann wäre für die SQL-Schnittstelle der Variablentext an dieser Stelle zuende und es würde wieder eine Befehlssequenz folgen.

Um dies zu unterbinden, müssen Variablentexte vorbehalndelt werden. Das übernimmt PHP gerne mit einer Funktion, die auf das DBMS abgestimmt sein muss.

$variablentext = "'" . mysql_real_escape_string($textvariable,$con) . "'";

Bei MySQL übernimmt das diese Funktion.
Da sie sich über die Connection auch noch Informationen besorgt, wie das DBMS die Vorbehandlung gerne hätte, bnötigt sie die Verbindungskennung (Connection-Handle) zusätzlich zur Variable.

PHP hat nun, um schlimmstes zu verhüten, eine eingebaute Funktion "magic Quotes", die die Paramter des Environments automatisch behandelt, bevor sie in die Variablen des Scriptes überstellt werden. Dies Funktion passt aber nicht zu den meisten Datenbanken. Deshalb sollte man sie lieber ausschalten und DANN SELBER DARAN DENKEN, oder die Maskierung (Escaping) der Zeichen wieder rückgängig machen.

Siehe auch http://www.php.net/manual/en/function.get-magic-quotes-gpc.php

Harzliche Grüße vom Berg
http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau