kostenloser Webspace werbefrei: lima-city


PHP Code includen und nicht ausführen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    lugaborg

    Kostenloser Webspace von lugaborg, auf Homepage erstellen warten

    lugaborg hat kostenlosen Webspace.

    Hallo,
    mein heutiges Problem bezieht sich aufs editieren einer Seite. Ich möchte die Seite via include komplett aufrufen die includes der aufgerufenen Seite aber nicht ausfürhen (sonst sind diese beim überschreiben weg und im Falle einer Änderung bleibt diese Seite unverändert).
    Nun, wie funktioniert das ganze?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich verstehe den Grund nicht ganz. Also wie meinst du das "sonst sind diese beim überschreiben weg"?

    Da ich nicht ganz verstehe, was du möchtest, kann ich dir nicht so genau helfen.

    Aber wenn du einfach alle include/require s aus einem Code filtern willst, dann gibt es allgemein zwei Varianten:

    1. Du entfernst sie mit einem preg_replace(). Das würde ich nicht machen, weil du teilweise nur schwer erkennen kannst, was nun ein include ist und was nicht und wo ein include endet. Stell dir einfach ein echo "include 'halloworld.php'" vor, was dein Regex sicherlich auch entfernen würde.

    2. Du tokenized dein PHP-Dokument mit token_get_all(), findest die includes und entfernst sie. Das ist die sichere Lösung, aber auch eine, die etwas Verständnis von PHPs Internals erfordern könnte.
  4. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    Die Echos sind doch kein Problem. Musste halt nur das Regex sauber schreiben. Folgendes müsste eigentlich problemlos greifen:
    ~^[\s]*include[\s]?[(]?.*[)]?;$~

    Zwischen Zeilenanfang und "include" dürfen ausschließlich beliebig viele Spaces sein, danach nur noch ein oder kein Space, dann evtl. eine Klammer auf, dann ein beliebiger Name mit "" oder als $variable und danach nochmal evtl. eine Klammer und das Semikolon. Fertig. Das lässt eigentlich keinen Spielraum für irgendwelche Echos oder Sonstiges.

    Liebe Grüße
    - VampireSilence
  5. Der RCRE bringt dir hier glaube ich gar nichts. Es geht (nach meinen Verständnis der Frage) darum includes innerhalb des Source-Codes zu erkennen. Daher kannst du schonmal kein Anchoring benutzen. Damit reduziert sich dein Query auf:
    ~include[\s]?[(]?.*[)]?;~

    Dieser wiederum würde aber auch
    <?php echo "include 'a'";

    matchen (also das include darin.)

    Solche einfachen Fälle mit ' und " kannst du vielleicht noch erkennen, aber vergiss nicht, dass es auch noch viel schwerer zu erkennende Sachen gibt wie HEREDOC beispielsweise. Daher ist der einzig sichere Weg über den Tokenizer. Und sonderlich aufwändig ist das auch nicht.

    €dit: Warum setzt du eigentlich eckige Klammern um einzelne Zeichen?
    ~include\s?\(?.*\)?;~

    Ginge auch.

    Mal unabhängig von dem obigen in-String Problem, sehe ich da aber einige weitere Schwachstellen:
    1. \s? sollte \s+ sein, das können durchaus auch mehrere T_WHITESPACE sein.
    2. Ich benutze gerne auch mal Sachen wie
    require Class::process($var);
    Das ist soweit kein Problem, aber versuchen wirs mal mit
    require (Class::process($var));
    (würde ich natürlich niemals machen, um require gehören keine Klammern!). Hier würde dein Regex die Verschachlung ignorieren.
    3. Ich könnte jetzt noch vieeele weitere Beispiele nennen, wo der Regex versagen würde, aber ich denke das reicht, um zu demonstrieren, dass Regex hier nicht die Lösung ist.

    Beitrag zuletzt geändert: 11.7.2010 22:48:56 von nikic
  6. Autor dieses Themas

    lugaborg

    Kostenloser Webspace von lugaborg, auf Homepage erstellen warten

    lugaborg hat kostenlosen Webspace.

    Okay, da zu aller erst die Frage aufkamm wie genau ich es meine hier einmal kurz die genaue Erklärung:
    Ich möchte per include in ein Textarea den Quelltext einer anderen Seite aufrufen um selbige zu bearbeiten. Das Problem ist das in der Textarea dann der Quellcode wie im Browser angezeigt wird und somit die includes auf besagter Seite bereits ausgeführt sind, speichere ich nun das ganze besteht die Seite nun aus reinen HTML & CSS. Solte nun einer der Includes geändert werden wird die Änderung nicht übernommen.

    Hoffe das ganze ist genauer, solte der Tokenzier nun immernoch die geeignete Lösung darstellen werde ich selbigen natürlich nutzen.
  7. Ah, gut, das was du willst ist glaube ich bei weitem einfacher. Du willst also statt deine PHP-Datei auszuführen nur ihren Quelltext ausgeben? Ersetze include einfach durch file_get_contents():
    echo file_get_contents('Deine_Datei.php');
  8. Autor dieses Themas

    lugaborg

    Kostenloser Webspace von lugaborg, auf Homepage erstellen warten

    lugaborg hat kostenlosen Webspace.

    Und wieder einmal die perfekte Lösung, nun funktioniert alles nach meinen wünschen, danke ;D

    EDIT: kk, eine kleine Änderung und schon gehts nichts mehr, eigl auch logisch. Mittlerweile wird der Dateipfad auch als Variable angegeben, wichen ' ' allerdings eben nicht ausgeführt, zwichen " " hingegen wird auch die eingefügte Seite wieder ausgeführt.

    Beitrag zuletzt geändert: 13.7.2010 16:18:53 von lugaborg
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!