7 Oct 2011 15 commenti
Il problema che sorge per proteggere i file deriva dal fatto che conoscendo l'URL in cui questo è collocato qualsiasi utente potrà visualizzarlo e scaricarlo.
Per questo motivo nei casi in cui vogliamo consentire il download dei file solo agli utenti loggati si può agire in due modi differenti:
- salvare i file in campi BLOB di MySql;
- impedire l'accesso diretto alla directory che contiene i file tramite .htaccess.
Fra i due metodi quello che illustrerò in questo articolo sarà il secondo (che è il metodo che personalmente preferisco).
Bloccare l'accesso alla directory contenente i files
Anzitutto dovremo impedire l'accesso diretto al file conoscendo URL in cui esso è contenuto.
Questo problema potrebbe essere risolto semplicemente collocando i file fuori dalla document root. Tuttavia non tutti gli hosting forniscono tale possibilità.
Quindi, la soluzione che adotterò prevede l'impiego di un file .htaccess da collocare nella directory (che possiamo chiamare download) che contiene i file che vogliamo proteggere. Il file .htaccess conterrà semplicemente la seguente istruzione:
Deny from all
In questo modo qualsiasi richiesta http diretta ad uno dei file contenuto nella cartella "download" sarà negata: in particolare la risposta HTTP sarà 403 "Forbidden: You don't have permission to access".
Consentire il download solo agli utenti loggati
Nel precedente articolo ho illustrato in che modo poter forzare il download dei file.
La seconda fra le tecniche presentate eseguiva il download attraverso un file php che facceva da "filtro" e per semplificare le operazioni avevo creato la classe ForceDownload. La classe la potete scaricare al seguente link.
A questo punto sarà sufficiente apporre nel file download.php un controllo sullo status di login dell'utente. Ipotizziamo, semplicisticamente, che il login preveda la creazione di una variabile di sessione $_SESSION['auth'].
Utilizzando la classe ForceDownload avremo che il file download.php sarà il seguente:
<?php session_start(); if(!isset($_SESSION['auth'])){ // se non si è loggati exit('Solo gli utenti loggati possono scaricare i file!'); } require_once('ForceDownload.class.php'); // settiamo la cartella che contiene i file da proteggere $dir = "download/"; $file = isset($_GET['file']) ? $_GET['file'] : ''; $download = New ForceDownload($dir, $file); $download->download() or die ($download->get_error());
A questo punto poniamo che si voglia per scaricare il file "catalogo.pdf" presente nella cartella download avremo il seguente link:
<a href="download.php?file=catalogo.pdf">Scarica il nostro catalogo</a>
Conclusioni
Ricapitoliamo il tutto:
- Collochiamo i file che è possibile scaricare in un unica cartella (nell'esempio la cartella è "download/");
- Neghiamo l'accesso diretto ai file presenti nella cartella tramite .htaccess che collocheremo al suo interno;
- Creiamo il file download.php il quale, dopo aver verificato che l'utente è loggato, eseguirà il download tramite la classe ForceDownload.
- Il link per poter scaricare il file sarà diretto al file download.php ed avrà come variabile GET 'file' il nome del file che vogliamo far scaricare.
Se avete problemi ad integrarlo lasciatemi un commento e vi risponderò il prima possibile.
Se invece vi sono stato d'aiuto e volete rendermi felice iscrivetevi alla fan page e condividete tale risorsa sui social network.
Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.
15 Commenti presenti
nella classe ho dovuto modificare il path aggiungendo uno /
$this->path = $this->dir ."/". $this->filename;
Grazie
ci sono riuscito , solo che ora non mi decodifica i file scaricati correttamente, nei file doc inserisce parte della pagina download e un mare di codici strani, i file pdf non li apre proprio dice errore di decodifica
come si fa ad autenticare gli utenti?
@pierangelo: questa cosa mi risulta nuova. Non saprei.
Ottimo veramente, un ottimo suggerimento per proteggere i file download!
Grazie di cuore!
mario
20 May 2019 ore 16:35