15 commenti apache, tutorial, php

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:

  1. salvare i file in campi BLOB di MySql;
  2. 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.

DOWNLOAD​​

 

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:

  1. Collochiamo i file che è possibile scaricare in un unica cartella (nell'esempio la cartella è "download/");
  2. Neghiamo l'accesso diretto ai file presenti nella cartella tramite .htaccess che collocheremo al suo interno;
  3. Creiamo il file download.php il quale, dopo aver verificato che l'utente è loggato, eseguirà il download tramite la classe ForceDownload.
  4. 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

avatar mario

mario

20 May 2019 ore 16:35

avatar Marco

Marco

24 March 2017 ore 00:44

nella classe ho dovuto modificare il path aggiungendo uno /
$this->path = $this->dir ."/". $this->filename;

Grazie

avatar giuseppe

giuseppe

09 March 2017 ore 18:25

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

avatar giuseppe

giuseppe

09 March 2017 ore 16:53

avatar Francesco

Francesco

24 December 2016 ore 18:12

avatar Piero

Piero

11 October 2014 ore 16:34

avatar Olimpio Romanella

Olimpio Romanella

18 September 2014 ore 23:49

avatar Maria

Maria

18 September 2014 ore 15:28

avatar acido

acido

06 February 2014 ore 11:27

come si fa ad autenticare gli utenti?

avatar Olimpio Romanella

Olimpio Romanella

01 January 2014 ore 15:14

@pierangelo: questa cosa mi risulta nuova. Non saprei.

avatar pierangelo

pierangelo

01 January 2014 ore 14:57

avatar pierangelo

pierangelo

01 January 2014 ore 14:57

avatar riccardo

riccardo

18 April 2013 ore 10:35

avatar riccardo

riccardo

18 April 2013 ore 10:30

avatar Luca

Luca

01 November 2011 ore 12:54

Ottimo veramente, un ottimo suggerimento per proteggere i file download!
Grazie di cuore!