Antje Bijken: PHP Code ausführen bei "geparstem Template"

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

  1. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. 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

    --
    The only program that runs perfectly every time, is a virus.
    1. Hallo Phillip,

      das klingt interessant, kannst Du mir das genauer erklären?

      Kuß,
      Antje

      1. 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

        --
        The only program that runs perfectly every time, is a virus.