misterunknown: PHP-Handler für nur _eine_ Datei?

Moin,

wie kann ich dem Apache sagen, dass nur eine einzelne Datei, beispielsweise index.php, ausgeführt wird, und alle anderen Dateien, beispielsweise evil.php, nicht?
Ich habe es so versucht:

RemoveHandler .php  
AddHandler php index.php

Aber so lassen sich dummer Weise auch andere PHP-Skripte ausführen...

Grüße Marco

--
Ich spreche Spaghetticode - fließend.
  1. Tach!

    wie kann ich dem Apache sagen, dass nur eine einzelne Datei, beispielsweise index.php, ausgeführt wird, und alle anderen Dateien, beispielsweise evil.php, nicht?

    Mit <Files ...>. Gegebenenfalls musst du noch einen übergeordnet konfigurierten Handler für alles PHP in diesem Verzeichnis/VHost außer Kraft setzen. RemoveHandler oder RemoveType (je nach Konfiguration) sollte dabei helfen.

    dedlfix.

    1. Moin,

      Mit <Files ...>. Gegebenenfalls musst du noch einen übergeordnet konfigurierten Handler für alles PHP in diesem Verzeichnis/VHost außer Kraft setzen. RemoveHandler oder RemoveType (je nach Konfiguration) sollte dabei helfen.

      Ich möchte das gern innerhalb der .htaccess regeln, da das alles nur für ein untergeordnetes Verzeichnis gelten soll.
      Ich habe folgende 2 Sachen Probiert:

      RemoveHandler .php  
      RemoveType .php
      

      Ich hab beides einzeln und auch zusammen getestet. Trotzdem wurden alle Skripte ausgeführt. Dann habe ich probiert:

      <FilesMatch ".*">  
      SetHandler None  
      </Files>
      

      Das wirkte. Um dann noch die index.php ausführbar zu machen, habe ich noch

      <Files index.php>  
      SetHandler php5-script  
      </Files>
      

      hinzugefügt. Das funktioniert auch.

      Warum allerdings RemoveHandler und RemoveType keine auswirkung hatten, kann ich nicht sagen. Könnte das etwas damit zu tun haben, dass PHP bei mir als Apache-Modul läuft? In der Apache-Doku habe ich dazu nichts gefunden.

      Grüße Marco

      --
      Ich spreche Spaghetticode - fließend.
      1. Tach!

        Warum allerdings RemoveHandler und RemoveType keine auswirkung hatten, kann ich nicht sagen.

        Erklärungsversuch, wobei ich nicht weiß, ob das so stimmt: RemoveHandler kann nur das entfernen, was AddHandler explizit zu dieser Dateiendung konfiguriert hat. In deinem Server ist hingegen ein <Files>-Container mit SetHandler enthalten. Remove konnte dann nichts wegräumen, dein <Files>-Container hat aber den anderen überschreiben können.

        dedlfix.

        1. Moin,

          Erklärungsversuch, wobei ich nicht weiß, ob das so stimmt: RemoveHandler kann nur das entfernen, was AddHandler explizit zu dieser Dateiendung konfiguriert hat. In deinem Server ist hingegen ein <Files>-Container mit SetHandler enthalten. Remove konnte dann nichts wegräumen, dein <Files>-Container hat aber den anderen überschreiben können.

          Klingt plausibel, ich guck gleich mal nach, ob es sich so verhält.

          Grüße Marco

          --
          Ich spreche Spaghetticode - fließend.
  2. Du leitest alles auf eine Datei um:

    RewriteRule ^(.*)$ index.php

    und schließt dann mittels $_SERVER['REDIRECT_URL'] im Kopf dieser Datei alle anderen Aufrufe aus.
    Der Vorteil wäre, dass du dieses Verfahren über eine Datenbank steuern kannst, falls du irgendwann doch mal Ausnahmen brauchst - und glaub mir Ausnahmen braucht man IMMER. Außerdem kann man es leichter testen, da man nicht immer den Server neu starten muss.

    Gruß
    effizienter
    T-Rex

    1. Moin,

      Du leitest alles auf eine Datei um:
      RewriteRule ^(.*)$ index.php
      und schließt dann mittels $_SERVER['REDIRECT_URL'] im Kopf dieser Datei alle anderen Aufrufe aus.
      Der Vorteil wäre, dass du dieses Verfahren über eine Datenbank steuern kannst, falls du irgendwann doch mal Ausnahmen brauchst - und glaub mir Ausnahmen braucht man IMMER. Außerdem kann man es leichter testen, da man nicht immer den Server neu starten muss.

      Es stimmt - Ausnahmen wird es immer geben^^ Das Problem an deiner Lösung ist, dass es nicht möglich ist eine andere Datei downzuloaden: das soll aber möglich sein - sie sollen nur nicht als PHP interpretiert werden können. Ich könnte zwar in der index.php auslesen, welche Datei gefordert wurde, und die dann per file_get_contents() ausgeben, aber das ist von hinten durch die Brust ins Auge^^

      Grüße Marco

      --
      Ich spreche Spaghetticode - fließend.
      1. Ich könnte zwar in der index.php auslesen, welche Datei gefordert wurde, und die dann per file_get_contents() ausgeben, aber das ist von hinten durch die Brust ins Auge^^

        Na also da hast du doch schon die Lösung. Zudem kannst (nicht musst) du einen Logger bauen der mitloggt welche Datei wie oft downgeloadet wurde. Und du kannst das Ganze über einen Login laufen lassen - also man darf die Datei nur downloaden wenn man eingeloggt ist (wo auch immer).

        Ich arbeite aktuell bei einem Unternehmen wo ich einen anderen Entwickler abgelöst habe. Der hat alles erdenkliche in die htaccess gehauen. Es gibt htaccess Dateien die haben locker 200 Zeilen mit Umleitungen. Da geht es wild hin und her. A leitet auf b, b leitet auf c. c gibt es nicht und eine 404 Seite geht auf :D. Dann gibts noch hammerlogiken das alle Anfragen mit zahlen auf eine Datei geleitet wird - ausnahmen wenn die Datei mit t anfängt. Mit anderen Worten selbst dedlefix wäre überfordert und das will was heißen.

        Deshalb ist mein Ansatz die htaccess möglichst sauber zu halten. Das hat den Vorteil:
        1. dass du die Datenbank als Administrationswerkzeug heranziehen kannst.
        2. Loggs mitlaufen lassen kannst.
        3. Rechtevergabe.
        4. Unittests.

        Natürlich gibt es auch den Nachteil, dass immer eine Programmiersprache angesteuert werden muss, was man mit ein wenig Performance bezahlt.

        Gruß
        Mittelstand und Htaccess entlastender
        T-Rex

        1. Om nah hoo pez nyeetz, T-Rex!

          In der Wikipedia wäre dein Beitrag Kandidat für den Artikel des Tages. YMMD.

          Deshalb habe ich "fachlich hilfreich" als "gefällt mir" missbraucht.

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Spinne und Spinner.

          1. Moin,

            Deshalb habe ich "fachlich hilfreich" als "gefällt mir" missbraucht.

            Ganz ehrlich? Ein "Gefällt mir"-Button habe ich mir auch schon einige Male gewünscht ;)

            (Ja, Gunnar, ich weiß, dass es eine Zitatesammlung gibt^^ Da wandert der Beitrag jetzt auch hin.)

            Grüße Marco

            --
            Ich spreche Spaghetticode - fließend.
        2. Moin,

          Na also da hast du doch schon die Lösung. Zudem kannst (nicht musst) du einen Logger bauen der mitloggt welche Datei wie oft downgeloadet wurde. Und du kannst das Ganze über einen Login laufen lassen - also man darf die Datei nur downloaden wenn man eingeloggt ist (wo auch immer).

          Einen Login habe ich nicht. Ich habe eine Live-Demo eines File-Managers.

          [...] Mit anderen Worten selbst dedlefix wäre überfordert und das will was heißen.

          Das halte ich für ein Gerücht :D

          Deshalb ist mein Ansatz die htaccess möglichst sauber zu halten. Das hat den Vorteil:

          1. dass du die Datenbank als Administrationswerkzeug heranziehen kannst.
          2. Loggs mitlaufen lassen kannst.
          3. Rechtevergabe.
          4. Unittests.

          Das stimmt wohl, ist aber für meinen Zweck etwas zu overpowered ;) Meine htaccess ist sehr übersichtlich, da sie nur 10 Zeilen enthält. Und ich erwarte keine "buttloads of exceptions", so dass ich mir die Datenbank sparen kann.

          Grüße Marco

          --
          Ich spreche Spaghetticode - fließend.
    2. Tach!

      Du leitest alles auf eine Datei um:
      RewriteRule ^(.*)$ index.php

      Inklusive der index.php? Das gibt Rekursion.

      und schließt dann mittels $_SERVER['REDIRECT_URL'] im Kopf dieser Datei alle anderen Aufrufe aus.
      Der Vorteil wäre, dass du dieses Verfahren über eine Datenbank steuern kannst, falls du irgendwann doch mal Ausnahmen brauchst - und glaub mir Ausnahmen braucht man IMMER.

      YAGNI, vermutlich. Das ist schon recht aufwendig und ich würde das erst implementieren, wenn der Bedarf sichtbar ist.

      Man muss sich aber auch fragen, ob der Lösungsweg zur (nicht näher beschriebenen) Aufgabenstellung passt. Vielleicht ist es besser das (Upload?-)Verzeichnis generell unausführbar zu machen (oder gleich ganz aus dem DocumentRoot herauszunehmen) und das eine Script anderswo hinzulegen.

      Außerdem kann man es leichter testen, da man nicht immer den Server neu starten muss.

      In einer .htaccess notiert braucht es keinen Neustart für (Add|Remove)(Handler|Type) oder <Files>.

      dedlfix.

      1. Inklusive der index.php? Das gibt Rekursion.

        Nein. Ich hab das Prinzip am laufen. Rekursionen war da nie ein Problem.

        In einer .htaccess notiert braucht es keinen Neustart für (Add|Remove)(Handler|Type) oder <Files>.

        Stimmt...keine Ahnung wie ich darauf komme. Wahrscheinlich verwechsel ich das gerade mit php Extensions. Mein Fehler.

        Außerdem sei noch gesagt das ein "du kannst" was anderes bedeutet als ein "mach zu aller erst" ;).

        Gruß
        du darfst!
        T-Rex