2013-11-14 6 views

Antwort

9

PHP standardmäßig kann bereits auf Dateien außerhalb des Webstamms zugreifen, sofern nicht mit einer Direktive open_basedir eingeschränkt (oder abgesicherten Modus, aber ich hoffe, Sie sind nicht in diesem Käfig).

Es ist normalerweise eine gute Übung, innerhalb einer VirtualHost-Konfiguration eine open_basedir Einschränkung einzufügen. Sie können mehrere Verzeichnisse angeben, die durch : unter Linux und ; unter Windows getrennt sind.

Um auf diese Dateien zuzugreifen, verwenden Sie entweder einen absoluten Pfad oder einen Pfad relativ zur Position der aufgerufenen PHP-Datei. (Sie müssen also ../ erreichen, um die oben genannten Ebenen zu erreichen).

Vergewissern Sie sich auch, dass die Verzeichnisse, in die Sie schreiben möchten, dem Webserver-Benutzer zugewiesen sind und Schreibrechte haben.

Ansonsten haben Sie zweite Option:

In Ihrem www-Verzeichnis, eine "image.php" Datei erstellen, mit einem ähnlichen Inhalt:

<?php 
    header('Content-Type: image/png'); 
    readfile("../img/" . $_GET['img']); 
?> 

Und rufen Sie Ihre Bilder mit

<img src="image.php?img=myimage.png" /> 

Bitte beachten Sie, dass Ihre PHP-Datei sollte nicht so einfach sein :) Da Sie möglicherweise mehrere Bildformate (und Prov Iding die richtigen Header für sie), die Überprüfung auf schädlichen Dateipfad/Einschlüsse (Sie wollen nicht _GET $ verwenden, ohne die Validierung/die Eingabebereinigung), Extra-Caching etc. etc. etc.

Aber das sollten Sie eine Idee, wie Sie Ihr Problem ansprechen können.

+0

[kommt mir bekannt vor.] (https://stackoverflow.com/ Fragen/13357994/Zugriff-eine-Datei-welche-ist-befindet-vor-außerhalb-des-Server-Root-Verzeichnisses # Antwort-13358201) – showdev

+0

Es ist möglich, aber es ist nicht die gleiche Antwort. – Legionar

3

So einfach wie das, dieser Wille Ausgang das Bild mit der richtigen Header,
daran erinnern, dass Sie den Header gesetzt haben(), bevor irgendetwas aus dem Ausgabepuffer
=> kein Echo oder drucken Spülung vor

 
$file = '../../somedirectory/image.jpg‘; 
header('Content-Type:image/jpeg‘); 
header('Content-Length: '.filesize($file)); 
echo file_get_contents($file); 
0

verwenden, um die ob_clean() Funktion von pHP vor dem Readfile()

es usefull Raum zu vermeiden, wie Probleme

Verwandte Themen