PHP Code ausführen bei "geparstem Template"
Antje Bijken
- php
Hallo!
Ich hoffe, ich kriege das hier richtig formuliert:
Ich habe eine Webseite mit folgendem System:
1. Es gibt eine Index.php Seite, die das grundsätzliche Layout definiert.
2. Der PHP Code lädt nun alle nötigen Templates in Variablen
2. Nun stehen an manchen Stellen php Variablen, die als Inhalt die eingelesenen Templates haben und ausgegeben werden.
Das funktioniert ganz gut, nur wird in den Templates enthaltener PHP Code nicht mehr ausgeführt. Ich habe schon versucht, den Code in den Templates zu kennzeichnen (z.B. über "{{php}} und {{/php}}" und dann zu filtern und über eval() auszugeben, das klappt zwar, aber nicht an der richtigen Stelle des Templates.
Nochmal als lustige Grafik ein Schema einer solchen Seite:
|-----------|
header |
---|
main site |
----------- |
footer |
------------- |
Kann mir jemand weiterhelfen? Ich bin verzweifelt.
Gruß und Kuß,
Antje
Hello,
dafür gibt es die Funktion eval(). Die ist aber nur für PHP-Profis geeignet, da man sich ganz schnell eine Hintertür baut. Die Quellen von eval() müssen auf jeden Fall aus einer "trusted area" kommen.
Liebe Grüße aus http://www.braunschweig.de
Tom
Halihallo Antje
Das funktioniert ganz gut, nur wird in den Templates enthaltener PHP Code nicht mehr ausgeführt. Ich habe schon versucht, den Code in den Templates zu kennzeichnen (z.B. über "{{php}} und {{/php}}" und dann zu filtern und über eval() auszugeben, das klappt zwar, aber nicht an der richtigen Stelle des Templates.
Was spricht dagegen das Template einfach über include_once statt
fopen/fread/fclose einzulesen? - Sprich: Du brauchst eine
Fallunterscheidung, ob das Template PHP-Code enthält oder nicht.
Falls nicht, wird es über fread eingelesen, falls doch über
include(_once). Ggf. wäre dies eine etwas einfachere Lösung.
Der Hinweis von Tom, dass die Quellen aus einer trusted area
entnommen werden müssen, gilt natürlich auch hier.
Viele Grüsse
Philipp
Hallo Phillip,
das klingt interessant, kannst Du mir das genauer erklären?
Kuß,
Antje
Halihallo Antje
das klingt interessant, kannst Du mir das genauer erklären?
Über eine Variable im PHP-Script wird ja festgelegt, welches Template
eingelesen werden soll. Nennen wir diese Variable mal $tstrPageId.
Dann hast du zwei Typen von Templates:
a) enthält PHP-Code und kann so mit include_once ausgeführt werden.
b) enthält reines HTML und kann so einfach über Dateioperationen
eingelesen werden und ausgegeben werden.
Jetzt musst du nur prüfen, ob das Template in $tstrPageId PHP-Code
enthält oder nicht (bitte jetzt nicht mit irgendeiner
RegularExpressen kommen, denn dies wäre vielzuviel overhead). Ich
würde dies über einen assoziatives Array lösen. Existiert der
Schlüssel $pagesWithPhp[$tstrPageId], dann wird include_once
ausgeführt. Falls du dies nicht über ein Array lösen kannst, würde
ich der Einfachheit einfach empfehlen alles (wenn auch kein PHP
enthalten) über include_once einzubinden.
Das $pagesWithPhp Array musst du natürlich manuell pflegen. Kommt
ein PHP-Script hinzu, musst du es dort "registrieren", sodass dein
loader-Script weiss, dass es dieses über include_once einbinden soll.
Aussehen tut dies dann etwa so:
if (isset($pagesWithPhp[$tstrPageId]) {
include_once( $tstrPageId );
} else {
echo(file_get_contents($tstrPageId));
}
Sei nur verdammt vorsichtig mit diesem $tstrPageId, so wie es hier
steht liessen sich auch Dateien ausgeben, die der Angreifer nicht
sehen sollte (.htusers). Am besten du erstellst auch hier ein Array
mit gültigen PageId's (also Dateinamen oder Id's auf das Template).
Falls $tstrPageId nicht als Schlüssel vorkommt, gibst du eine
Fehlermeldung alla 404-er aus (Ressource not found).
Viele Grüsse
Philipp