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 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

ho provato quanto descritto, ma non funziona, l'unica differenza che ho fatto è quella di cambiare cartella, i file scaricabili sono sono nella cartella download, ma nella cartella scarica, quindi nel file download ho cambiato da: $dir = "download/"; a $dir = "scarica/"; però niente, mi nega sempre l'accesso ai file, ho provato anche a levare il file .htaccess ma niente: se non sono loggato mi dice: Solo gli utenti loggati possono scaricare i file! se invece sono loggato mi dice "File not found".
Faccio presente che ho inserito tutti e tre i file nella cartella dove sono contenuti i file da scaricare e i file sono .htaccess, download.php e ForceDownload.class.php. Faccio presente che sono in un server Linux su aruba.

avatar Francesco

Francesco

24 December 2016 ore 18:12

salve è possibile far scaricare un documento in pdf diverso per ogni utente ? mi spiego ho creato un sito dove aggiungo io gli utenti ( operai ) ogni operaio ha una sua password che gli assegno io l'operaio effettua il login e va nel suo id profilo e si preleva ciò che gli serve

avatar Piero

Piero

11 October 2014 ore 16:34

Io ho proprio questo problema, nonostante i miei file siamo tutti php, un tipo li ha scaricati.
Inanzitutto vorrei sapere come si fa a scaricarli, e poi capire bene come proteggerli…sono nuovo.

avatar Olimpio Romanella

Olimpio Romanella

18 September 2014 ore 23:49

@Maria: in questo articolo non affronto tale aspetto in quanto è un argomento a cui ho dedicato specifica attenzione in altri articoli:

Registrazione e login con php

Articolo un po' datato ma la logica da seguire è corretta.

avatar Maria

Maria

18 September 2014 ore 15:28

Grazie dell'articolo Olimpo, io però ho la stessa domanda di acido, almeno credo e a cui non hai dato risposta. Hai descritto la procedura per proteggere le cartelle contenenti file, ma l'utente finale (quello che in pratica deve scaricare il file) come fa ad autenticarsi? Che percorso deve seguire?
Grazie

avatar acido

acido

06 February 2014 ore 13:42

come si fa ad autenticare gli utenti?

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

ottimo! perchè solo con le immagini ho problemi, confrontando i binari sono diversi...

avatar riccardo

riccardo

18 April 2013 ore 10:35

Mi rispondo da solo.
è sufficiente mettere
<img src="download.php?file=a.jpg">
ed il gioco è fatto.
ciao,

avatar riccardo

riccardo

18 April 2013 ore 10:30

Scusami Oly, ti riposto la domanda che avevo fatto nell'altro tuo articolo. Ho provato questa classe ed è veramente ok, bravo! Ma se i files nella cartella download fossero immagini, ed oltre a permetterne il download volessi anche, alle persone autorizzate, consentirne la visualizzazione (per intenderci col tag <img>), è possibile? ci sono metodi alternativi?
Grazie di nuovo,

avatar Luca

Luca

01 November 2011 ore 12:54

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