zisslaweng.de

 Home    CSS    PHP    HTML    JavaScript    Allgemein    Sitemap   exemption-filter

Ein Problem, das Sie nicht unterschätzen sollten.

Eingaben eines Nutzers gelangen irgendwann immer an eine Stelle, an der ein SQL String zusammengesetzt wird. Würden Sie bei einem Script, das für das Login verantwortlich ist (also einem Lesezugriff), vermuten, dass es gefährdet sein könnte? Auf den ersten Blick sicher nicht.
Ich halte es für so wichtig, dass ich hier zwei Beispiele geben möchte:

select * from TableUser where user = '$user' and 
   password = password('$password');

Angenommen, $user enthält, durch ein Formular übermittelt, nun aber nicht den Namen eines braven Users, sondern folgende Zeichenfolge:

         bla'; drop table TableUser;--

Was passiert? $user enthält diesen String. Eingefügt in das SQL Statement und dann aufgelöst durch PHP sieht die Zeile folgendermassen aus:

.. where user ='bla'; drop table TableUser;--' and password ... ;

Das Ergebnis: 2 SQL Befehle hintereinander: der erste liefert kein Ergebnis, der zweite gefährlich. Der Trick dabei: die folgenden "--" leiten einen SQL Kommentar ein, ab dort wird der String durch den SQL Parser ignoriert und das eingeschleuste Kommando, bis dahin ja gültig, wird ausgeführt.

Bedingung für einen Erfolg eines solchen Angriffes ist natürlich, dass der Angreifer den Namen der Tabelle kennt, womöglich auch noch die Bezeichner der Spalten. Unter diesem Gesichtspunkt: Was ich hier mache (auf den Seiten php..) mit Offenlegung der Tabellen- und Feldnamen ist, wenn es denn etwas zu verbergen gäbe, Kamikaze.

Dadurch, dass das Passwort verschlüsselt abgelegt ist, sind Sie als Programmierer gezwungen, die Funktion password() zu verwenden.
Ein fauler Programmierer könnte auf folgende Idee kommen:

select * from TableUser where password like '$_GET['password']';
jetzt kommt der "Böse" und gibt folgendes Passwort an:
' or '1' like '1
Das ergibt eine wunderbar universelle Abfrage, die Bedingung stimmt immer und listet ihre komplette Datenbank:
select * from TableUser where password like '' or '1' like '1';
Nicht mutlos werden, auf der folgenden Seite einige Maßnahmen, mit denen Sie die Usereingaben prüfen und absichern können.

Lesen Sie den informativen Artikel "SQL Injection Attacks by Example" hier und programmieren Sie defensiv.
 
Im PHP Handbuch Hinweise, wie man es richtig macht, nämlich den Userinput  maskieren.

Logo