Oppure tenere i file scaricabili fuori dalla document root. Ma così non potrebbero essere letti direttamente dal web server.
PHP però è in grado di leggere tutto il filesystem del server (ovviamente dove l'utente del server web ne ha i permessi), quindi per proteggere un file dallo scaricamento selvaggio si può leggere il file da scaricare con il comando readfile() e aggiungendo qualche header.
downloadfile.php
ob_end_flush();
<?php
ob_start();
// Eseguo dei check per vedere se l'utente può scaricare il file...
...
...
if (!$user_can_download){
die("Non hai il privilegio di scaricare questo file");
}
// Imposto nome e path del file
$pathname = "/home/web/files/";
$filename = "pippo.pdf";
$mime = "application/x-pdf";
ob_end_clean(); // Eventuali errori che php può dare
// in output vengono eliminati
// Iniziano gli header
header('Cache-Control: public, must-revalidate');
header('Pragma: hack');
header('Content-type: '.$mime);
header('Content-Length: ' .filesize($pathname.$filename));
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Transfer-Encoding: binary\n');
// Leggo il file e lo mando in output
readfile($pathname.$filename);
?>
Il precedente script legge il file e lo manda in output, forzando oltretutto il download del file (non lo fa aprire in una scheda/finestra del browser!).
Bisogna però prestare attenzione che lo script php non contenga spazi o altri caratteri dopo la chiusura del tag php (?>) altrimenti il file risulterebbe corrotto.
Nessun commento:
Posta un commento