Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Evitare il download diretto di file dati (file non PHP)

Proteggeri i file conservati nel Server per evitare il loro scaricamento dal Web
Proteggeri i file conservati nel Server per evitare il loro scaricamento dal Web
Link copiato negli appunti

È noto che non è possibile, a meno di bug del Web server (i quali, in passato, sono stati per la verità tutt'altro che rari, specie su Microsoft IIS, che aveva la seccante propensione all'auto-crash), visualizzare da browser il sorgente di script PHP remoti, in quanto, richiamando da client un file .php, questo viene innanzitutto eseguito su server, ad hoc configurato, dall'interprete PHP stesso. Ciò significa che viene ritornato al browser il solo output HTML (JavaScript, immagini eccetera), ma non il codice originario.

A meno che l'interprete PHP stesso non si blocchi senza "riaversi", il codice sorgente è quindi protetto da sguardi indiscreti. E se, in aggiunta, si volessero proteggere, oltre al codice, anche i file dati, ivi compresi i file di configurazione? In altri termini: com'è possibile evitare il download diretto di file dati, pur richiamandoli via URL?

Se come URL viene dato qualcosa del tipo: http://mio_sito/doc/YCM0000076.zip, generalmente tale ZIP viene spedito dal Web server al browser via HTTP per essere aperto o salvato in locale. Nessuna esitazione. Come evitare?

Esistono due soluzioni.

Prima soluzione

Se deteniamo il controllo completo del server su cui gira la nostra applicazione (quindi non si è in hosting), è possibile salvare i file dati in una cartella superiore alla root del Web server (root che come noto è solitamente chiamata htdocs o wwwroot), dato che al browser è intrinsecamente impedito l'accesso a cartelle ad essa superiori.

A questo punto: per permettere all'utente di scaricare un file, anziché un semplice link HTML allo stesso, dovrà essere richiamato uno script PHP che provveda ad inviare il file al client in HTTP. Ad esempio:

<a href="scarica_file.php?id_file=...">Scarica il file</a>

o, per gli amanti del JavaScript:

<a href="#." OnClick="scarica_file.php?id_file=...">Scarica il file</a>

Il codice per lo scaricamento del file dati è il seguente (valido per il download di uno ZIP, compatibile sia con Mozilla Firefox che con MS Internet Explorer):

header("Content-Type: application; name=".$nome_file);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$dimensione_file);
header("Content-Disposition: inline; filename=".$nome_file);
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: private");
header("Pragma: public");
 
readfile($percorso_assoluto.$nome_file);

Seconda soluzione (solo per Web server Apache)

Apache mette a disposizione un insieme di direttive di accesso particolari, veicolate dal file .htaccess. Al fine di abilitare tali direttive, nel file di configurazione di Apache (httpd.conf) deve essere sostituito AllowOverride All ad AllowOverride None.

Per evitare che i file all'interno di una cartella e contenuti in tutte le sue sottocartelle vengano scaricati via URL, è semplicemente necessario creare un file di puro testo ".htaccess" ed inserirlo nella cartella voluta:

<Files ~ ".+">
Order allow,deny
Deny from all
Satisfy All
</Files>

Il padre e tutte le cartelle figlie erediteranno le direttive. Ora, come su detto, per far scaricare un file in locale, anziché un semplice link HTML allo stesso, dovrà essere richiamato uno script PHP che provveda ad inviare il file al client.

Se un utente qualsiasi tenta di accedere al file, il browser visualizzerà il seguente messaggio standard di errore:

Forbidden
You don't have permission to access /mio_sito/doc/YCM0000076.zip on this server.

Ti consigliamo anche