phpbar.de logo

Mailinglisten-Archive

alternative zu eval um Formel mit Variablen auszuwerten (War: Re: [php] eval ohne Sicherheitslücken)

alternative zu eval um Formel mit Variablen auszuwerten (War: Re: [php] eval ohne Sicherheitslücken)

Bastian Haustein bh at plan-i.de
Die Feb 3 10:48:21 CET 2004


Hallo Norbert,
hallo Liste!

Danke für die Vorschläge!

> zuerst sollte man immer versuchen, den User von jeglichen
> Handeingaben zu befreien, weil er sich sowieso nur vertippt.
> Lass ihn seine Eingaben ueber DropDowns zusammen stellen ...

Egal wie der normale Benutzer das eingibt, ob über drop-downs oder
direkteingabe: wenn ich das Ergebnis über "eval" auswerte hab ich immer das
gleiche Sicherheitsrisiko! (Ein geschickter Angreifer kann ja das
Benutzerinterface einfach umgehen.)

> > $ausdruck="echo $geheinmesdatenbankpasswort";
> Tip:
> Wenn man den Befehlsstring einer Funktion zum Ausfuehren
> uebergibt, kann der User zumindestens keine Variablen des
> Haupt-Scriptes ueberschreiben oder auslesen.
> Der Namensraum einer Funktion ist in sich geschlossen ...

Das hatte ich auch schon überlegt, zunächst aber mal beseite gelassen. Aber
ich denke, das werde ich gleich noch einbauen. (Zumal ich die
Auswerten-Funktion an mehrereren Stellen brauche, und eine Funktion da ja
schon Sinn macht.)


> > $ausdruck="include 'hackerscript.php';"
> Tip:
> wenn include('boesesScript.php'); funktioniert, hat der
> Angreifer schon mal einen FTP-Zugang auf Deinem Host
> und braucht also keine "Hilfe" mehr ... ;-)

Das war ja genau das, was ich geschrieben hatte ;-) Deswegen suche ich ja
eine Alternative zu eval. Ich war vollkommen davon überzeugt, dass eval zwei
Parameter hat, und das man im zweiten, optionalen Parameter angeben kann,
was alles im ersten Parameter erlaubt ist.


> > $ausdruck="mysql_query('DROP something FROM tabelle');"
> Tja:
> Unsere lieben SQL-Befehle machen es Angreifern sehr leicht,
> denn selbst wenn es kein Connect gibt, versucht PHP mit
> den vermeintlich 'ueblichen' Daten auf die DB zuzugreifen.

Da im Endeffekt "$ausdruck" (=die Benutzereingabe) in einer Datenbank
gespeichert ist, muss auch eine Datenbankverbindung offen sein. Bei dem
Beispiel ging es mir darum zu zeigen, dass mit runden Klammern allgemein
Funktionsaufrufe möglich sind, was nicht in meinem Sinne ist (im besonderen
nicht, wenn dabei meine Datenbank gelöscht wird).

Deswegen ist ja mein bisheriger Ansatz: Runde Klammern und
Anfürungszeichen(einfache und doppelte) raus, dann ist es nicht möglich,
dass durch Manipulation des Strings '$ausdruck' Funktionen aufgerufen, oder
fremder Code eingebunden wird, oder? Der PHP-Parser nimmt doch nicht etwas
URL-Encodierten Quelltext oder irgendetwas in der Richtung an, oder?

Ich bin über jeden Vorschlag dankbar, denn noch gefällt mir der Lösungsweg
über eval() nicht so richtig.

Grüße!

Bastian



php::bar PHP Wiki   -   Listenarchive