phpbar.de logo

Mailinglisten-Archive

[php] AW: [php] AW: [php] WHERE Klausel transportieren

[php] AW: [php] AW: [php] WHERE Klausel transportieren

Gerald Grote g.grote_(at)_tu-bs.de
Sat, 1 Jul 2000 22:19:17 +0200


Hi,

> > Das direkte Ausführen des übergebenen Stings als Query ist
> > brandgefährlich.
> >
> > So erlaubst du jedem Surfer, beliebige Queries zu schicken. Ich
> > könnte z.B.
> > folgende Anfrage schicken:
> > "free like 'x'; DROP DATABASE db_name"
>
> Frage: Wie soll denn der User aufgrund des Spaltennamens auf den
> Datenbanknamen kommen?

Weil Datenbank- oder Tabellennamen sich oft sehr leicht erraten lassen. Aber
bei PHP ist das wirklich nicht allzu problematisch, da man nur eine Anfrage
pro Query ausführen kann. Wirklich gefährlich sind Systemaufrufe, in denen
irgendwelche Parameter aus der URL ungeprüft eingebaut werden.

> > Du baust den String seelenruhig in deine Query ein und mit etwas
> > rumprobieren habe ich deine Datenbank ziemlich schnell zerhackt.
> >
> > Grundregel für Sicherheit von Web-Applikationen: Niemals übergebene
> > Parameter direkt und ungeprüft ausführen (auch nicht, wenn sie
> > nur Teil der
> > Query sind).
> >
> > Warum übergibst du nicht einfach nur das "j" als parameter, das
> löst dann
> > auch die Probleme mit dem en-/decoden.
>
> ganz einfach: Weil dies nur eine Dimension ist. Der gesamte String kann
> durchaus
> bis zu 15 unterschiedliche Komponenten enthalten. Das in jeweiligen
> Parametern
> zu speichern ist etwas zu umständlich.

Ob es einfacher ist "par1=j&par2=c&par3=xy..." in eine URL zu schreiben oder
"spalte1 like j AND spalte2 like c AND spalte3 like xy ..." in die URL zu
codieren, sei mal dahingestellt. Auf jedenfall ist letztere Variante in
einigen Fällen problematischer. Wenn z.B. jemand deine Seite samt dem Teil
der Datenbankanfrage bookmarkt, wirken sich Änderungen bei der Datenbank
beim erneuten Abruf fatal aus. Das ist eine Frage der sauberen Schnittstelle
und eines halbwegs eingehaltenen Geheimnisprinzipes.

Mir wäre ausserdem garnicht wohl dabei, wenn jeder Surfer die Fehlerroutinen
meiner Datenbank durch verhunzte Anfragen testen könte.

> Zu Deinem Einwand: Auf die Datenbank kann via Query nur von denjenigen IP-
> Adressen zugegriffen werden, die für diesen Zugriff auch registriert sind.
> Meint: Der Webserver, von dem die Requests geschickt werden muß
> im gleichen
> Subnet wie der DB-Server stecken. Somit wird der normale Surfer kaum eine
> Chance haben, eine normals Query abzusetzen.

Genau das ist der Trugschluss! Da du den Parameter über die URL holst und
auf dem Server zusammenbaust, führt DEIN Skript sie auf DEINEM Server aus.
Genau diese IP-Zugriffsbeschränkungen werden durch solche Konstrukte
übergangen.

[...]

> Danke für die Anregungen.

Bitteschön :-)

Gerald.




php::bar PHP Wiki   -   Listenarchive