2017-05-22 1 views
0

Ich entwickle eine Webanwendung und ich muss Bilder und PDF-Dokumente speichern und anzeigen.Wie kann ich direkten Zugriff auf ein Verzeichnis verweigern, aber es von einem PHP-Skript zulassen?

Ich wollte direkten Zugriff auf die Bilder und Dokumente und auf seine Container-Datei verweigern. Ich meine, wenn jemand versucht, per URL auf den Ordner zuzugreifen, sollte ein 403-verbotener Fehler auftreten.

Dazu habe ich eine .htaccess-Datei in den Ordner wie folgt aus:

Order deny,allow 
Deny from all 

meine Web-Anwendung verwenden, über ein PHP-Skript, kein Problem gibt es die pdf Dokumenten: wie diese

header('content-type: application/pdf'); 
readfile('../../../files/'.$document); 
Zugriff

Aber wenn ich versuche, auf die Bilder unter Verwendung <img style=max-width:100% src=../files/'.$image.'>' zugreifen, wird mein Zugriff verweigert und ich erhalte einen http-Statuscode 403 verboten.

Wie kann ich mit meiner Webanwendung auf die Bilder zugreifen, aber den direkten Zugriff auf die Bilder verweigern?

Auch ich würde gerne wissen, warum ich auf die PDF-Dokumente zugreifen kann, aber ich kann nicht auf die Bilder zugreifen.

+0

Erstellen Sie ein Skript, das überprüft, ob der Benutzer angemeldet ist und über die erforderlichen Berechtigungen verfügt, und alle Dateien mit diesem Skript bereitstellt. (aka, erstellen Sie die Datei namens file.php, und übergeben Sie sie Dokument-ID.Das Skript überprüft die Zugriffsebenen des Benutzers und liest die zu verwendende Datei. Ihr img-Tag muss 'src = '../file.php? Img = 12'' oder so ähnlich sein. – Dimi

Antwort

1

Ich würde einen Handler für einen dieser Dateitypen verwenden.

Legen Sie die Dateien außerhalb des webfähigen Dateisystems ab. Wenn Ihr Webstammverzeichnis/var/www/html lautet, erstellen Sie/var/www/files/directory und speichern Sie alle Ihre Dateien dort.

$file_id = intval($_REQUEST['file_id']); 

$sql = sprintf("SELECT * FROM files WHERE file_id=%d",$file_id); 
$query = $mysqli->query($sql); 
$file = $result->fetch_assoc() 

// add business logic for 
// if $user_id is allowed to view $file_id 

if (preg_match("/\.pdf$/i",$file['filename'])){ 
    header('content-type: application/pdf'); 
} else if (preg_match("/\.(jpg|gif|png)$/i",$file['filename'])){ 
    header('content-type: application/pdf'); 
} else { 
    die("Unknown file type"); 
} 

$full_path = sprintf("/var/www/files/%s",$file['filename']); 
readfile($full_path); 

erlauben Dies würden Sie Ihre Anwendungslogik zu verwenden, welche Dateien zu bestimmen, die von einem Benutzer zugegriffen werden soll, den Zugang aufnehmen und halten sie zugängliches Verzeichnis aus dem Web.

Anstatt also so etwas wie dieses

<img style=max-width:100% src=../files/'.$image.'>' 

der Verwendung würde ich vorschlagen, für den Umgang mit Bildern

<img style=max-width:100% src=/handler.php?file_id='.$file_id.'>' 

und einen Link, wie dies für das Herunterladen PDFs

<img style=max-width:100% src=/handler.php?file_id='.$file_id.'>' 
eine Syntax ähnlich wie dies mit

Es sollte ziemlich einfach sein vorausgesetzt, Sie haben eine Datenbank von PDFs und Bildern. Etwas so einfaches.

CREATE TABLE `files` (
    `file_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `file_name` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`file_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
+0

Wo soll ich den ersten Code schreiben? Was macht das auch? Die zweite funktioniert nicht, da Sie immer noch direkt auf die Dateien im Ordner zugreifen können. – al2593

+0

Ich habe einen anderen Ansatz hinzugefügt, der helfen sollte. Ich gehe davon aus, dass Sie einen Zugriffs-Handler für Ihre PDF-Dateien haben und dies wäre derselbe Handler, den Sie für Ihren Bild-Handler aufrufen würden. – jbrahy

0

mit folgenden Regel versuchen,

Order deny,allow 
Deny from all 
allow from 127.0.0.1 

es von Ihrer lokalen Server-Adresse ermöglicht, auf das Ihr Web-App gehostet wird.

Edit:

Options -Indexes 

Verwenden oben auszuschalten Verzeichnis zu Verzeichnis, wird es verboten Fehler geben.

+0

Es funktioniert nicht. Ich habe auch allowinfg von localhost und von :: 1 versucht. Das Problem mit dem letzten ist, dass Sie immer noch direkt auf den Ordner zugreifen können. – al2593

Verwandte Themen