2011-09-15 3 views
4

J'essaie de fournir .pdf et .doc aux utilisateurs autorisés sur un site Web. L'utilisateur ne peut voir la page de sélection de fichier que lorsqu'il est connecté, mais cela n'empêche pas un utilisateur non autorisé de voir les documents s'ils ont connaissance de l'URL complète.PHP pour protéger PDF et DOC

Comment puis-je empêcher les utilisateurs non autorisés d'accéder à ces fichiers?

Répondre

8

la réponse est assez simple, @ Jon Stirling a publié ce billet que je tapais, mais je vais vous expliquer un peu plus pour vous

on a mis vos fichiers en dehors de votre répertoire public html,

EG cPanel configuration

user/public_html 
    /public_html/download.php 

user/documents/ 
    /documents/file.doc 
    /documents/file.pdf 

@dhh a posté unde basefichier php cependant comme vous voulez forcer télécharger leurs choses que vous pouvez faire comme trouver et fournir le bon type mime ici est une extension sur son code quant à la meilleure façon de télécharger 1 forcer un fichier, et 2 permettent différents types de fichiers

download.php

//check users is loged in and valid for download if not redirect them out 
// YOU NEED TO ADD CODE HERE FOR THAT CHECK 
// array of support file types for download script and there mimetype 
$mimeTypes = array(
    'doc' => 'application/msword', 
    'pdf' => 'application/pdf', 
); 
// set the file here (best of using a $_GET[]) 
$file = "../documents/file.doc"; 

// gets the extension of the file to be loaded for searching array above 
$ext = explode('.', $file); 
$ext = end($ext); 

// gets the file name to send to the browser to force download of file 
$fileName = explode("/", $file); 
$fileName = end($fileName); 

// opens the file for reading and sends headers to browser 
$fp = fopen($file,"r") ; 
header("Content-Type: ".$mimeTypes[$ext]); 
header('Content-Disposition: attachment; filename="'.$fileName.'"'); 

// reads file and send the raw code to browser  
while (! feof($fp)) { 
    $buff = fread($fp,4096); 
    echo $buff; 
} 
// closes file after whe have finished reading it 
fclose($fp); 

PS voici abig liste des types MIME si vous voulez ajouter le support pour d'autres fichiers http://www.hansenb.pdx.edu/DMKB/dict/tutorials/mime_typ.php

+1

C'est exactement ce que je cherchais, merci! – Mike

3

Ce que vous pouvez faire, c'est fournir l'équivalent d'un proxy PHP pour les fichiers.

Placez les fichiers en dehors de la racine Web, puis rédigez un script qui vérifie que l'utilisateur est autorisé à y accéder. Si ce n'est pas le cas, redirigez-les, si c'est le cas, définissez les en-têtes appropriés et affichez les données du fichier.

3

Vous devez stocker tous les téléchargements en dehors de votre racine publique accessible au public (mais dans votre base de données, bien sûr) et ajouter un script de téléchargement pour envoyer le téléchargement si l'utilisateur est autorisé.

Voici un exemple de "comment" envoyer un fichier pour le télécharger.

$file = "ireland.jpg"; 
$fp = fopen($file,"r") ; 
header("Content-Type: image/jpeg"); 

while (! feof($fp)) { 
    $buff = fread($fp,4096); 
    print $buff; 
} 
1

Ce a fait le travail pour moi: j'ai placé un. pdf et un fichier .htaccess avec le fol en y introduisant du code dans un dossier normal (je l'ai appelé "docs") sur mon serveur web Apache.

Order Deny,Allow 
Deny from all 
Allow from 127.0.0.1 

<Files /index.php> 
    Order Allow,Deny 
    Allow from all 
</Files> 

Alors je pris le code de Martin Barkers réponse ci-dessus, a changé le chemin du fichier à « docs/exemple.pdf », et collé dans un fichier .php dans mon répertoire racine. C'est tout. Vous ne pouvez pas accéder au fichier par URL maintenant, mais vous pouvez le télécharger si vous exécutez test.php.

+2

C'est une bonne idée si vous n'avez pas de support pour le répertoire utilisateur du serveur web E.G vous avez seulement accès au répertoire public_html et non au répertoire ci-dessus car certains hébergeurs gratuits fournissent –