Zugriff auf Dateien außerhalb des document_root
Gastleser
- php
- webserver
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');
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.
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.
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
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
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
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
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
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
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
@@Der Martin
Anders als in der Botanik assoziiert man bei Dateisystem- oder Objekthierarchien die Wurzel eher mit "oben".
🖖 Живіть довго і процвітайте
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
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
Damit wäre also bewiesen, dass Dateisysteme eher Hängepflanzen sind.
Auch in einem Datengrab sieht man die Wurzeln von unten wachsen.
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
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
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'
) . '/'
);
?
> am Ende von zu inkludierenden Dateien ist nicht nur nicht nötig, sondern sehr oft schädlich!)realpath()
würde ihn löschen) hat den Vorteil, dass ich ihn nicht vergessen kann. Etwas wiereguire_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:
libs_dir
(eventuell) sehr wohl öffentlich abrufbar sind, die im private_dir
und im shared_libs_dir
nicht.../private
und ../shared_libs
mit kopieren.