Announcement

Collapse
No announcement yet.

PHP-Befehl file() macht Probleme wenn einzulesende Datei "<?php" enthält

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PHP-Befehl file() macht Probleme wenn einzulesende Datei "<?php" enthält

    Hallo,

    ich benutze seit Jahren den Befehl file() um in PHP den Inhalt einer gesamten Datei als Array einzulesen.

    Bisher habe ich entweder einen lokalen Dateipfad (C:\...\filename.php) oder eine URL (http:/www.../filename.php) angegeben. Die Dateien wurden immer problemlos eingelesen, auch wenn diese PHP-Source-Code enthielten und demnach mit dem Prefix <?php beginnen.

    Nun verwende ich zum ersten mal folgenden Pfad: http://localhost/.../filename.php

    Das (für mich) überraschende Ergebnis: Es wird nichts eingelesen! Also Beispiel:

    Inhalt der Datei http://localhost/.../filename.php: <?php bla bla bla echo "Hallo world"; bla bla ?>

    Ausgeführter PHP-Code:

    $test_tab = file('http://localhost/.../filename.php');

    if($test_tab !== FALSE) echo "Nicht FALSE!<br>";

    if(!is_array($test_tab)) echo "Kein Array<br>";

    echo "Länge".strlen($test_tab);

    Ergebnis der Ausführung:

    Nicht FALSE!
    Kein Array
    Länge 0

    Das gleiche passiert, wenn ich mit fopen() fgets() fclose() die Zeilen der Datei einzeln einlesen will.

    Sobald ich aber das <?php aus dem Datei-Inhalt entferne (oder auch nur das letzte p von dieser Prefix) funktioniert es einwandfrei, sprich der Inhalt wird eingelesen und befindet sich danach in $test_tab[0].

    Kann mir jemand sagen, warum sich PHP so verhält und ob es einen Parameter gibt, über den dieses Verhalten so steuern kann, dass er mir den Inhalt ganz normal einliest?

    Noch eine Info: Wenn das <?php nicht direkt am Anfang stehen würde, würde er den Inhalt der Datei bis zu dem <?php einlesen. Also Beispiel: Datei-Inhalt = echo "hello world"; <?php bla bla bla bla ende over and out ?>. Dann würde $test_tab[0] hinterher echo "hello world"; enthalten.

    Vielen Dank im Vorraus,
    Michael

  • #2
    Vermutlich, weil dein Webserver vor der Auslieferung der Datei das PHP interpretieren wird. Der Webserver erwartet einen HTTP-Client und liefert die Resource dementsprechend aus
    Christian

    Comment


    • #3
      Hi Christian,

      irgend so etwas muss das wohl sein. Wobei es für mich komisch klingt, denn in der Hilfe von file() heißt es "Liest eine komplette Datei in ein Array" Ende! Da steht nicht ...und verarbeitet noch so ganz nebenbei den PHP-Code, wenn welcher in der Datei vorhanden ist.

      Du weißt nicht zufällig, wie ich ihn daran hindern kann, das zu tun? Ansonsten muss ich mir wohl mal die Context-Parameter des Befehls anschauen, aber so ganz selbsterklärend scheinen die nicht gerade zu sein.

      Gruß
      Michael

      Comment


      • #4
        irgend so etwas muss das wohl sein. Wobei es für mich komisch klingt, denn in der Hilfe von file() heißt es "Liest eine komplette Datei in ein Array" Ende! Da steht nicht ...und verarbeitet noch so ganz nebenbei den PHP-Code, wenn welcher in der Datei vorhanden ist.
        Es wird ja auch davon ausgegangen, dass du in einem Filesystem arbeitest. Die Verarbeitung macht ja auch nicht der file(), sondern der Webserver bevor der das an dein file() gibt

        Du weißt nicht zufällig, wie ich ihn daran hindern kann, das zu tun? Ansonsten muss ich mir wohl mal die Context-Parameter des Befehls anschauen, aber so ganz selbsterklärend scheinen die nicht gerade zu sein.
        Das wird wohl nicht gehen. Du könntest ja mit dieser Technik von jeder beliebigen Website dann eine PHP-Seite anfordern (bsp. index.php) und diese einschl. dem PHP-Quellcode bekommen. Daher wird das so wohl nicht möglich sein.
        Christian

        Comment


        • #5
          So wie Du das erklärst, leuchtet das ein, aber in dem Fall dürfte ja file('http:/www.../filename.php'); auch nicht funktionieren. Und entgegen dem, was ich oben geschrieben habe, funktioniert das tatsächlich auch nicht. Ich hatte das ausprobiert, hatte aber bei meinem Test intelligenterweise die einleitende PHP-Prefix vergessen hinzuzufügen. ;-)

          Somit ergibt das natürlich dann Sinn. Dann muss ich mir da wohl irgendetwas anders kluges überlegen.

          Vielen Dank für Deine Hilfe.

          Gruß
          Michael

          Comment


          • #6
            Du kannst die Datei umbenennen. filename.txt
            Dann wird sie allerdings auch nicht mehr bei einem Abruf durch einen Browser als PHP interpretiert.
            Jeder kann dann natürlich die Datei ebenfalls abrufen....
            Christian

            Comment


            • #7
              Hallo,

              wie schon rausgefunden wurde, hat das nichts mit file() zu tun, sondern mit der Art und Weise wie der entfernte HTTP-Server die Dateien ausliefert. Wenn du auf diesen Zugriff hast und dein Abruf z.B. immer von einer festen IP erfolgt, dann könnte man den Server z.B. mit einer RewriteRule dazu bringen, php-Dateien an diese IP als Text auszuliefern.

              In die Serverkonfiguration oder eine .htaccess:
              Code:
              RewriteCond  %{REMOTE_ADDR}  =xxx.xxx.xxx.xxx
              RewriteCond  %{REQUEST_URI} (/|\.htm|\.php3|\.php|\.html|/[^.]*)$  [NC]
              RewriteRule (.*) $1 [H=none,T=text/plain]
              Damit werden alle .htm, .php3, .php und .html Dateien, die von IP xxx.xxx.xxx.xxx angefragt werden, ohne Parser einfach als text/plain ausgeliefert.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment

              Working...
              X