PHP Code parsen

Schau dir mal die Funktion “eval” an :wink:

[quote=“marvink1993”]OK Danke… Hört sich gut an…

Aber wie wende ich das ganze auf mein Script an?[/quote]
Vielleicht, in dem du dir erst mal anschaust, was das Handbuch zur genannten Funktion zu sagen hast, die Beispiele dort nachvollziehst, und dann mal was ausprobierst …?

Btw., ob man wirklich auch Programmlogik in die Datenbank auslagern sollte, darüber kann man sicherlich streiten - ich bin im Normalfall kein Freund davon.

Und eval birgt auch Risiken, wenn man es zu unbedarft anwendet, bspw. auch auf von Nutzern bereitgestellte Daten. Und wenn jemandem nicht vorher klar ist, dass aus der Datenbank ausgelesener und einfach ausgegebener Code nicht automatisch ausgeführt wird …

hi,

Evtl. hilft es dir, wenn du die output_buffering funktionen mithinein beziehst…
php.net:outcontrol

mfg Joey

Beispiel (ohne es gestestet zu haben):

<?php
# irgendwie wird eine Variable erzeugt ...
$boese="unlink('./index.php');";

# ... irgendwann später wird das als PHP ausgewertet:
eval($boese);
# wenn da Fehler drinstecken, wird es natürlich ganz böse ;o)
?>

Wenn die Zeichenkette $boese nun letztlich aus einer
Nutzereingabe resultiert und man gar nicht beabsichtigt, seine
index.php zu löschen, so ist das Ergebnis eher unerfreulich…

Ideal für einen Angreifer ist natürlich, wenn $boese wie folgt
definiert wird:
$boese=$_GET(‘phpCode’);

de.php.net/manual/de/function.eval.php

Nun, natürlich kann man im Code überprüfen, ob was böses vorkommt…
z.B. mit ner konstruktion aus strpos, array und foreach
aber das wäre dann sehr aufwändig, jede böse funktoin da hinein zu schreiben und “sicher” ist es dann am ende immer noch nicht

Nein, eine solche “Überprüfung” kannst du komplett vergessen, das wirst du nie schaffen.

doch

Dann ist die Sinnhaftigkeit des Skriptes natürlich auch fragwürdig…

@michi7x7: Ja, dann kannst du auf den Versuch, den Code auszuführen, auch direkt verzichten, und ihn lieber als reinen Text behandeln - das ist ungefährlich, und obendrein bleiben alle Zeichen erhalten, du musst ihn nicht verstümmeln :slight_smile:

Aber mit eval kann ich so gut wie alles ausführen lassen, da hilft keine “Blacklist” von Funktionsnamen, die ausgefiltert werden sollen.

Das war eigentlich nicht ernst gemeint :slight_smile:
Und eine Blacklist ist sowiso total fürn Arsch…

$func = $_GET['func'];

call_user_func($func);
//bzw:
$func();

einfach die Funktion mittels GET übergeben und die Blacklist ist wirkungslos