2015-08-05 9 views
7

Mi sono imbattuto in modo strano per proteggere i file.scaricare i file con spazi nel loro nome - restrizione tramite htaccess

Fondamentalmente c'è un file download.php vuoto nella cartella protetta e due file che causano file da scaricare (dalla stessa cartella): .htpwd dove password è memorizzata e .htaccess:

RewriteEngine On 
##RewriteBase/
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] 
RewriteRule \.(.*)$ - [NC,F,L] 

RewriteCond %{QUERY_STRING} ^filename=(.*)$ 
RewriteRule ^download\.php$ %1 
RewriteRule (.*) - [E=file:$1] 
Header set Content-type "octet-stream" 
Header set Content-disposition "attachment; filename=%{file}e" env=file 

##AuthName "Restricted Access" 
##AuthType Basic 
##AuthUserFile /local/home/example/example.com/downloads/.htpwd 
##AuthGroupFile /dev/null 
##require valid-user 

Esempio di download link:
http://www.example.com/downloads/download.php?filename=dog%20cat%20cow.zip

Se nomefile è dog-cat-cow.zip - tutto funziona. Il problema inizia quando il nome del file è: "dog cat cow.zip", quindi il file verrà scaricato ma il nome del file dopo il download sarà "cane" anziché "cane gatto cow.zip". Quindi il problema è che le persone ottengono file senza nemmeno un'estensione e non hanno idea di cosa farne.

Come questo può essere risolto considerando semplicemente non è possibile rinominare quei file e rimuovere gli spazi? Non sono esperto su come leggere .htaccess e nessuna frase che potrei pensare di cercare dà una risoluzione simile del problema. Qualche idea?

+4

vi consiglio di fare qualcosa di simile 'Header set Content-disposition "attachment; filename = '% {file} e'" env = file', il nome del file tra virgolette – anonymous

+1

Come @anonymous dice, dal momento che il nome del file ha spazi, avrai bisogno di delimitatori di quote. Tuttavia, qual è questo extra 'e' per? – MrWhite

+0

"ma il nome del file dopo il download" - è possibile ottenere che il browser richieda sempre la posizione del download (consigliato) - in quel momento l'utente può correggere il nome del file. – MrWhite

risposta

1

Come accennato nei commenti, magari provare:

RewriteEngine On 
##RewriteBase/
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC] 
RewriteRule \.(.*)$ - [NC,F,L] 

RewriteCond %{QUERY_STRING} ^filename=(.*)$ 
RewriteRule ^download\.php$ %1 
RewriteRule (.*) - [E=file:$1] 
Header set Content-type "octet-stream" 
Header set Content-disposition "attachment; filename='%{file}'" env=file 

##AuthName "Restricted Access" 
##AuthType Basic 
##AuthUserFile /local/home/example/example.com/downloads/.htpwd 
##AuthGroupFile /dev/null 
##require valid-user 

In alternativa, perché non impostare il tipo di contenuto e Disposition all'interno del file download.php stessa?

$fileStorageDirectory = '/the/folder/the/downloadable/files/are/in/'; 

// Check for Parameter 
if(!isset($_GET['filename']) || $_GET['filename']==''){ 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    die('No File Specified'); 
} 

$fileName = trim($_GET['filename']); 
$fileRequested = $fileStorageDirectory.$fileName; 
// Check File Exists 
if(!file_exists($fileRequested)){ 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    die('File Not Found'); 
} 
// Check File is Readable 
if(!is_readable($fileRequested)){ 
    header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true, 404); 
    die('File Not Accessible'); 
} 
// Send the File 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="'.fileName.'"'); 
readfile($fileRequested); 
exit; 
Problemi correlati