Gastleser: Zugriff auf Dateien außerhalb des document_root

Hallo!

Vor kurzem hatte ich hier im Forum gelesen, man könnte/sollte ein Passwort außerhalb des document_root speichern.

Wie aber kann man darauf zugreifen?

Bisher kenne ich nur den Zugriff unterhalb des document_root, nämlich so:

require_once ($_SERVER['DOCUMENT_ROOT'].[ggf.Subdirectories].'/datei.txt');

  1. Hallo Gastleser!

    Ich bin kein PHP-Experte und werde daher keinen funktionstüchtigen Code bereitstellen. Ich werde nur einen Weg zeigen, wie das funktionieren könnte.

    Weg 1

    Du kannst, wie auch immer das geht, in das jeweilige Verzeichnis wechseln und dann immer ein Verzeichnis nach unten gehen. Von dort aus könntest du dann wieder Wechseln.
    Dies würde ich jedoch einem für Webserver Bash-Script eher zutrauen als PHP.

    Weg 2

    Du könntest $SERVER['DOCUMENT_ROOT'] irgendwie verarbeiten, dass du die obersten Ordner rausnimmst. Von dort aus könntest du dann wieder auf die Dateien zugreifen

    Weg 3

    Was einfach gesagt, aber schwer erfüllt (bei Nicht-Self-Hosting) ist:
    Nimm den absoluten Pfad des gesamten Dateisystemes.

    Mehr Wege fallen mir nicht auf Anhieb ein.

    Au revoir,
    Samuel Fiedler

    --
    In CSS gibt es ja position: absolute; und position: relative;. Was ist nun die Mischung daraus?
    Ganz klar: position: resolute!
    1. Hallo Samuel,

      Du kannst, wie auch immer das geht, in das jeweilige Verzeichnis wechseln und dann immer ein Verzeichnis nach unten gehen. Von dort aus könntest du dann wieder Wechseln.

      ich verstehe nicht, was du damit wirklich meinst.

      Dies würde ich jedoch einem für Webserver Bash-Script eher zutrauen als PHP.

      Wie lautete der Satz vor dem Vertauschen der Wörter?

      Was einfach gesagt, aber schwer erfüllt (bei Nicht-Self-Hosting) ist:
      Nimm den absoluten Pfad des gesamten Dateisystemes.

      Das ist bei den mir bekannten Hostern das Mittel der Wahl. Diesen für deinen Webauftritt passenden Pfad bekommst du entweder im Kundencenter (oder einer ähnlichen Administrations-Oberfläche) angezeigt, oder der Hoster beschreibt in seinen FAQ, wie man diesen Pfad aus einem Basis-Pfad ableitet (z.B. indem man seine Kundennummer oder seine Domain als letztes Pfad-Segment anhängt).

      Einen schönen Tag noch
       Martin

      --
      Мир для України.
      1. Hallo Samuel und Martin,

        Nimm den absoluten Pfad des gesamten Dateisystemes.

        Das ist bei den mir bekannten Hostern das Mittel der Wahl.

        Mittels $_SERVER['DOCUMENT_ROOT'] tut man genau das. Ich würde den absoluten Pfad aber keinesfalls in einem Programm hartcodieren. Weiß man, ob der Hoster bei Bedarf mal ein Web migiert und der Pfad dann auf einmal anders lautet?

        Wenn man den Basispfad vom Webserver frei Haus bekommt, sollte man das auch nutzen.

        Ein Ziel des Softwaredesigns ist das Vermeiden von festgelegten Abhängigkeiten, wo es nur geht.

        Rolf

        --
        sumpsi - posui - obstruxi
      2. Hallo Der Martin!

        ich verstehe nicht, was du damit wirklich meinst.

        Du bist im Verzeichnis DOCUMENT_ROOT. Dann gehst du ein Verzeichnis nach unten. Dann bist du nicht mehr im DOCUMENT_ROOT, sondern im „Elternverzeichnis“ von DOCUMENT_ROOT. Von dort aus kannst du den vorherigen Schritt beliebig oft wiederholen oder aber auf die Dateien zugreifen.
        OK, schlechte Idee. Ginge auch einfacher.
        Der Hintergrund dieser Idee war eigentlich nur, dass ich nicht wusste, ob man mitten in einem Dateipfad ein „../“ einbauen darf.

        Wie lautete der Satz vor dem Vertauschen der Wörter?

        „Dies würde ich jedoch einem für Webserver eher ungewöhnlichen Bash-Script mehr zutrauen als PHP.“

        Au revoir,
        Samuel Fiedler

        --
        In CSS gibt es ja position: absolute; und position: relative;. Was ist nun die Mischung daraus?
        Ganz klar: position: resolute!
        1. Hallo,

          Du bist im Verzeichnis DOCUMENT_ROOT. Dann gehst du ein Verzeichnis nach unten. Dann bist du nicht mehr im DOCUMENT_ROOT, sondern im „Elternverzeichnis“ von DOCUMENT_ROOT.

          Das wäre meinem Verständnis nach nicht "nach unten" sondern "nach oben"!

          Gruß
          Kalk

          1. Hi,

            Du bist im Verzeichnis DOCUMENT_ROOT. Dann gehst du ein Verzeichnis nach unten. Dann bist du nicht mehr im DOCUMENT_ROOT, sondern im „Elternverzeichnis“ von DOCUMENT_ROOT.

            Das wäre meinem Verständnis nach nicht "nach unten" sondern "nach oben"!

            ja, sehe ich auch so. Das machte einen Teil meines Nicht-Verstehens aus.

            Anders als in der Botanik assoziiert man bei Dateisystem- oder Objekthierarchien die Wurzel eher mit "oben".

            Einen schönen Tag noch
             Martin

            --
            Мир для України.
            1. @@Der Martin

              Anders als in der Botanik assoziiert man bei Dateisystem- oder Objekthierarchien die Wurzel eher mit "oben".

              Zitat 890

              🖖 Живіть довго і процвітайте

              --
              When the power of love overcomes the love of power the world will know peace.
              — Jimi Hendrix
              1. Hallo Gunnar,

                ja, sowas in der Art zu schreiben schwebte mir auch vor.

                Muss wohl an meinem berühmt berüchtigten braunen Daumen liegen.

                Rolf

                --
                sumpsi - posui - obstruxi
            2. Hello,

              Das wäre meinem Verständnis nach nicht "nach unten" sondern "nach oben"!

              ja, sehe ich auch so. Das machte einen Teil meines Nicht-Verstehens aus.

              Anders als in der Botanik assoziiert man bei Dateisystem- oder Objekthierarchien die Wurzel eher mit "oben".

              Damit wäre also bewiesen, dass Dateisysteme eher Hängepflanzen sind.
              Oder ist das jetzt sexisitsch? ;-P

              Glück Auf
              Tom vom Berg

              --
              Es gibt nichts Gutes, außer man tut es!
              Das Leben selbst ist der Sinn.
              1. Damit wäre also bewiesen, dass Dateisysteme eher Hängepflanzen sind.

                Auch in einem Datengrab sieht man die Wurzeln von unten wachsen.

        2. Hello,

          Du bist im Verzeichnis DOCUMENT_ROOT. Dann gehst du ein Verzeichnis nach unten. Dann bist du nicht mehr im DOCUMENT_ROOT, sondern im „Elternverzeichnis“ von DOCUMENT_ROOT. Von dort aus kannst du den vorherigen Schritt beliebig oft wiederholen oder aber auf die Dateien zugreifen.
          OK, schlechte Idee. Ginge auch einfacher.
          Der Hintergrund dieser Idee war eigentlich nur, dass ich nicht wusste, ob man mitten in einem Dateipfad ein „../“ einbauen darf.

          Einbauen darf man im Pfad erst einmal alles. Ob PHP dann den Pfad auch auflösen (realpath()) darf und damit benutzten, hängt von der Einrichtungsart ab: Modul, fastCGI, ....

          Wenn PHP als Modul des Apachen eingerichtet wird, ist die open_basedir()-Direktive (im VirtHost) maßgeblich.

          Auf einem shared Host sollte man für jeden VirtHost diverse Directories separat außerhalb der Document-Root anordnen:

          _skeleton/
          ├── data (d)
          ├── htdocs (d) 
          │   ├── bilder (d)
          │   ├── images (d) 
          │   ├── robots.txt (f)
          |   └── favicon.ico (f) 
          ├── includes (d)
          ├── logs (d)
          ├── sessions (d)
          └── tmp (d)
          

          Für das "bilder"-Directory (Upload) schalte ich z. B. grundsätzlich sämtliche Interpretation (php, CGI, ...) ab, da es innerhalb der DocRoot liegt.

          Glück Auf
          Tom vom Berg

          --
          Es gibt nichts Gutes, außer man tut es!
          Das Leben selbst ist der Sinn.
  2. Hallo Gastleser,

    ein PHP Script kann durchaus aus dem Document Root hinausgreifen, insoweit das die Zugriffsrechte auf dem Server erlauben. Oft ist es so, dass man außer dem Document Root vom Provider einen weiteren Ordner bereitgestellt bekommt.

    Bei meinem Hoster ist das beispielsweise:

    /customers/x/y/z
      /example.org
        /httpd.www            ← DOCUMENT_ROOT
        /httpd.private
        /tmp
    

    Ich könnte nun in "$_SERVER[DOCUMENT_ROOT]/../tmp" temporäre Dateien ablegen, oder ein Script mit Logindaten für die Datenbank aus "$_SERVER[DOCUMENT_ROOT]/../httpd.private/include/dbconnect.php" includen.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Bei meinem Hoster sah das so aus, dass es am Anfang

      /homepages/uYXZ
      

      gab. Darin habe ich SELBST die Ordner für die unterschiedlichen Domains angelegt:

      /homepages/uYXZ
         /Domain_1
         /Domain_2
         …
         /Domain_N
      

      und die Ordner in der mir zur Verfügung gestellten Verwaltung den jeweiligen Hostnamen/Domains zugeordnet (Domain_1 hat also /homepages/uYXZ/Domain_1) als Serverroot (= $_SERVER['DOCUMENT_ROOT']).

      Da ich einmal beim Verzeichnisse anlegen war hab ich weiter gemacht:

      /homepages/uYXZ
         /Domain_1
            /libs
         /Domain_2
            /libs
         …
         /Domain_n
            /libs
         /private
         /shared_libs
      

      In den Skripten includiere ich dann ganz stumpf folgendes Skript:

      <?php
      ### file: settings.php
      
      ## Verzeichnis für private Daten:
      ## (Nicht via HTTP[S] abrufbar.)
      define( 
          'private_dir',
          realpath(
              $_SERVER['DOCUMENT_ROOT']
              . '/../private'
          ) . '/'
      );
      
      ## Verzeichnis für Libarys, die von mehr
      ## als einer Webseite genutzt werden:
      ## (Nicht via HTTP[S] abrufbar.)
      define( 
          'shared_libs_dir',
          realpath(
              $_SERVER['DOCUMENT_ROOT']
              . '/../shared_libs'
          ) . '/'
      );
      
      ## Libarays für nur einen Webauftritt:
      ## (ACHTUNG: Via HTTP[S] abrufbar.)
      define( 
          'libs_dir',
          realpath(
              $_SERVER['DOCUMENT_ROOT']
              . '/libs'
          ) . '/'
      );
      
      • (Daran denken: Das ?> am Ende von zu inkludierenden Dateien ist nicht nur nicht nötig, sondern sehr oft schädlich!)
      • Das ich am Ende den Verzeichnisstrenner erzwinge (realpath() würde ihn löschen) hat den Vorteil, dass ich ihn nicht vergessen kann. Etwas wie
      reguire_once( shared_libs_dir . '/mysql_connect.php' );
      

      würde dann eben zu

      reguire_once( '/homepages/uYXZ/shared_libs//mysql_connect.php' );
      

      und der doppelte Verzeichnisstrenner (//) ist unschädlich, was das Vorgen „failsave“ macht - im Falle, dass man dessen Angabe vor dem Dateiname vergisst.

      Hinweise:

      • Man sollte im Kopf behalten, dass die Dateien im libs_dir (eventuell) sehr wohl öffentlich abrufbar sind, die im private_dir und im shared_libs_dir nicht.
      • Natürlich muss man bei einem Serverumzug bei der Verzeichnisstruktur bleiben und die notwendigen Dateien aus ../private und ../shared_libs mit kopieren.