PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: eval() klappt nicht


mf_2
2008-12-14, 07:04:59
Hallo,

ich habe ein kleines Problem mit eval().
Eines meiner Programme hat den PHP Code verschlüsselt in PHP Dateien abgelegt. Nur die Hauptdatei (index.php) ist unverschlüsselt. Darin ist die Funktion zur Entschlüsselung enthalten.
Nun wollte ich so eine Art include() mit Entschlüsselung bauen.
Dazu entschlüssle ich den Code und führe den dann mit eval() aus. Die entsprechende Funktion habe ich include_decrypt() genannt.
Dies klappt so weit auch ganz gut, so lange in dem eval() Code kein include_decrypt() auftaucht.
Wenn dies der Fall ist, dann wird der Code zwar ausgeführt, aber nicht gespeichert.
Um das mal zu verdeutlichen:
index.php bindet die Datei 'test.php' ein.
In dieser wird am Anfang eine test_includes.php Datei eingebunden.
Das klappt auch.
In der test_includes.php Datei wird eine Variable $bla definiert.
Diese Variable steht dann aber der test.php nicht zur Verfügung. Warum nicht?
Ich muss gestehen, ich kenne mich nicht so gut aus mit eval().

Daher habe ich auch schon eine Alternative gesucht, die mit einem identischen Ergebnis läuft:
Ich lasse das entschlüsselte Zeug in eine temporäre Datei schreiben, lese es mit include() und lösche die Datei dann wieder.

Wisst ihr weiter? Da bin ich jetzt schon die ganze Nacht dran gesessen ....

Gruß,
mf_2

PatkIllA
2008-12-14, 09:35:17
Nur mal aus Neugierde. Was soll die ganze Verschlüsselung bringen?
Sicherheit in irgendeiner Form kann es eigentlch nicht sein. Zumal eval gerade nach Lücken schreit. Wenn noch Benutzereingaben dazu kommen ist es schon fast unverantwortlich.
Das ganze läuft auch nur, wenn du den Schlüssel direkt mitlieferst.

mf_2
2008-12-14, 09:58:32
Die Verschlüsselung soll verhindern, dass der Quellcode einfach eingesehen werden kann.
Man braucht schon ein Passwort, um das Ganze wieder entschlüsseln zu können.
Daher denke ich dass das Ganze so unsicher nicht ist.
Ich will mich auch nicht auf eval() festbeißen. Wenn es eine elegantere Lösung gibt, mein Vorhaben umzusetzen, nehme ich die natürlich auch gerne.

PatkIllA
2008-12-14, 10:08:24
Vor wem soll das denn schützen?
Der Quellcode kann so eh nicht einfach eingesehen werden, weil ja der Parser drüber läuft.
Gegen den Ausfall des PHP-Parsers kannst du den Quellcode noch dadurch schützen, dass die zu inkludierenden Teile in einem Ordner liegen, der per .htaccess oder sonstigen Maßnahmen nicht per Browser eingesehen werden kann.
Gegen boshafte Absichten deines Hosters kannst du dich eh nicht schützen.

Kinman
2008-12-14, 11:42:20
Oder Du schreibst den Code in eine Datenbank.
Natürlich musst Du weitere includes in den inkludierten Teilen selbst zusammenfügen. Das würde auch bei Deiner Methode helfen.

mfg Kinman

darph
2008-12-14, 12:10:41
Wenn es eine elegantere Lösung gibt, mein Vorhaben umzusetzen, nehme ich die natürlich auch gerne.
http://www.zend.com/de/products/guard/

Aber ganz ehrlich: Wenn jemand so weit ist, daß er deinen Quellcode sehen kann, dann hast du ganz andere Probleme, als die Frage, welche Algorithmen zu zur Überprüfung einer Benutzereingabe verwendest und ob er die rausbekommt.

mf_2
2008-12-14, 12:53:26
Das Skript liegt nicht auf einem Online-Webspace wie 1und1 oder so, sondern wo anders, wo den eben auch mehrere Leute einsehen können.
Mit der Verschlüsselung sehen sie aber nur Zeichensalat.

Oder Du schreibst den Code in eine Datenbank.
Natürlich musst Du weitere includes in den inkludierten Teilen selbst zusammenfügen. Das würde auch bei Deiner Methode helfen.

mfg Kinman

Deine beiden letzten Sätze verstehe ich nicht ganz. Wie müsste ich meine include_decrypts dann ändern?
Eine Datenbank gibt es leider nicht.

rotalever
2008-12-14, 13:15:46
Wo liegt denn dann dieses index.php mit dem Schlüssel/Passwort?

Gast
2008-12-14, 13:46:57
Das Skript liegt nicht auf einem Online-Webspace wie 1und1 oder so, sondern wo anders, wo den eben auch mehrere Leute einsehen können.
und wo liegt deine index.php, die den entschlüsselungsalgorithmus samt schlüssel enthält?

mf_2
2008-12-14, 15:13:01
Die liegt da auch, aber das Passwort (Schlüssel) gebe ich über eine Art Login-Formular an.

PatkIllA
2008-12-14, 15:17:04
Die liegt da auch, aber das Passwort (Schlüssel) gebe ich über eine Art Login-Formular an.
Was ist das denn für ein merkwürdiger WebSpace?
Wenn die anderen auch schreiben können, dann lassen die sich mit einer Handvoll Zeilen einfach das Passwort zumailen.

Tommes
2008-12-14, 15:19:02
Was hast du denn so geheimes programmiert? :D

Kinman
2008-12-14, 15:24:56
Deine beiden letzten Sätze verstehe ich nicht ganz. Wie müsste ich meine include_decrypts dann ändern?
Eine Datenbank gibt es leider nicht.

Was macht eine include Funktion? Vereinfacht gesagt kopiert sie den Inhalt der zu inkludierenden Datei in die Ausführende Datei.
D.h. bevor Du eval aufrufst, gehst Du den Sourcecode durch und suchst nach include Befehlen (wie auch immer der dann heißen mag) und kopierst den Inhalt der angegeben Datei an diese Stelle in den String. Das ganze machst Du solang, bis Du kein include mehr findest. Und erst dann führst Du eval aus.

mfg Kinman

Tommes
2008-12-14, 17:32:17
Und das ganze rekursiv.

Kinman
2008-12-14, 18:09:08
Und das ganze rekursiv.

Einfacher zu programmieren aber in diesem Fall eventuell sogar ressourcenintensiver. Aber das müsste man Testen.

mfg Kinman