PHP:Securità per il trasferimento dei file tramite $ _GET

Pubblicato da Giuseppe MICACCIA - -
itskills.micaccia.eu:$_GET SECURITY

Questa è una variante sicura di un script che si trova un pò da per tutto sull'Internet, come su questo sito, ad esempio:http://www.commentcamarche.net/forum/affich-2165116-php-forcer-le-download.

E un modulo per scaricare file tramite $ _GET.

Adesso facciamo una versione securizzata.

 

 

itskills.micaccia.eu:sécurité $_GET

 

Ci sono diverse tecniche per securizzare un $ _GET, usando un filtro, ad esempio.

La tecnica che vi propongo qui è unica, semplice ed efficace.

 

$File2Download = isset($_GET['Fic']) ? trim($_GET['Fic']) : ''; 
$RepDownload   = './Download'; 
$ListeDownload = array(
                       'DownloadMe.zip',
                       'DownloadMe.pdf'
                       ); 
if (!empty($File2Download) && in_array($File2Download,$ListeDownload) && (file_exists("$RepDownload/$File2Download"))) 
        {
        $Taille = filesize("$RepDownload/$File2Download"); 
        header("Content-Type: application/force-download; name='$File2Download'"); 
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: $Taille"); 
        header("Content-Disposition: attachment; filename='$File2Download'");
        header("Expires: 0");
        header("Cache-Control: no-cache, must-revalidate");
        header("Pragma: no-cache");
        readfile("$RepDownload/$File2Download");
        exit();
        }
    else
        {
        // traitement de votre choix : message à l'utilisateur et/ou mail à l'administrateur, etc...
        } 

 

$ListeDownload est une liste contenant les noms des fichiers à télécharger.

Facciamo un controllo con "in_array($File2Download,$ListeDownload)" : se $ _GET viene modificato da un utente che tenta di scaricare file differenti di quelli proposti, non avrà niente e potrebbe anche vedere un messaggio magari ("The file you want to download is gone to lunch!").

Infatti, solo i file che sono elencati in   $ListeDownload potranno essere scaricati.

Il vincolo è che ogni volta che si aggiunge un nuovo file nella directory di download, si dovrà completare la variabile "$ListeDownload".

Per rimediare a questo vincolo, è anche possibile caricare dinamicamente variabile "$ListeDownload" leggendo il contenuto del repertorio "$RepDownload".

In questo caso, è sufficiente sostituire:

$ListeDownload = array(
                      'DownloadMe.zip',
                      'DownloadMe.pdf'
                      ); 

da:
 
$Fic2Ignore = array(
                    // mettre ici tous les fichiers non téléchargeables qui se trouvent dans ce répertoire, "htaccess" and Co...
                    '.',
                    '..',
                    '.htaccess',
                    'index.html'
                    );
$ListeDownload = array();    
foreach (scandir($RepScarica) as $FicFound) 
	if (!in_array($FicFound,$Fic2Ignore))
			$ListeDownload[]=$FicFound;

 

itskills.micaccia.eu:download PDF

Commenti bloccati.