5. Sicurezza dei dati remoti

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

E’ noto che non è possibile (7) visualizzare da browser il sorgente di script PHP remoti, in quanto, richiamando da client un file .php, questo viene innanzitutto eseguito su server (8) dall’interprete PHP stesso. Ciò significa che viene ritornato al browser il solo output HTML (JS, immagini etc), ma non il codice originario.

Il codice sorgente è quindi “protetto” da sguardi indiscreti. Ma se, invece, si volessero proteggere oltre al codice, anche i file dati? In altri termini, com’è possibile evitare il download diretto di file dati, pur richiamandoli via URL?

Se infatti come URL viene scritto qualcosa del tipo: http://mio_sito/doc/YCM0000076.zip, tale ZIP viene spedito dal WebServer al browser via HTTP per essere aperto o salvato in locale.

Come evitare? Esistono due soluzioni.

5.2 Prima soluzione

Ove possibile (9), salvare i file dati in una cartella superiore alla root del WebServer (htdocs o wwwroot), dato che al browser è intrinsecamente impedito l’accesso a cartelle ad essa superiori. 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 in HTTP. Ad esempio:
Codice PHP:
<a href=”scarica_file.php?id=…”>Scarica il file</a
o, per gli amanti del JavaScript (come me):
Codice PHP:
[url="”#.”"]Scarica il file[/url
Il codice per lo scaricamento del file dati è il seguente (valido per il download di uno ZIP, compatibile sia con Firefox che con MS IE):
Codice PHP:
header("Content-Type: application; name=".$nome_file);
header("Content-Transfer-Encoding: binary");
header("Content-Length: “.$dimensione_file);
header("
Content-Dispositioninlinefilename=".$nome_file);
header("
Expires0");
header("
Cache-Controlno-cachemust-revalidate");
header("
Cache-Control: private");
header("
Pragma: public");
readfile(
$percorso_assoluto.$nome_file); 
____

(7) A meno di bug del WebServer i quali, in passato, sono stati per la verità tutt’altro che rari, specie su MS IIS. Oppure a meno che l’interprete PHP stesso non crashi senza “riaversi”. In quel frangente i sorgenti non dovrebbero essere protetti, per quanto ne so.
(8) Ovviamente se il WebServer è stato istruito per farlo.
(9) Se il programma PHP gira su server in hosting, questa via il più delle volte non è percorribile.

5.3 Seconda soluzione (Apache)

Apache mette a disposizione un insieme di direttive di accesso particolari, veicolate dal file .htaccess.
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:
codice:
<Files ~ ".+"> 
Order allow,deny 
Deny from all 
Satisfy All 
</Files>
Come sopra, per far scaricare un file in locale, anziché un semplice link HTML allo stesso, dovrà ora essere richiamato uno script PHP che provveda ad inviare il file al client.

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

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

Nota:
Affinché Apache sia abilitato ad usare queste direttive, nel suo file di configurazione (httpd.conf) deve essere sostituito AllowOverride All ad AllowOverride None.