PHP : Sécurité pour le transfert de fichier via $_GET

Rédigé par Joseph MICACCIA - -
itskills.micaccia.eu:$_GET SECURITY

Voici une variante sécurisé d'un bout de script qu'on trouve sur un peu partout sur Intenet, comme sur ce site, par exemple : http://www.commentcamarche.net/forum/affich-2165116-php-forcer-le-download.

C'est un module pour le téléchargement de fichiers via $_GET.

Nous allons voir comment le sécuriser simplement et efficacement.

 

 

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

 

Il y a plusieurs techniques pour sécuriser un $_GET, comme le filtrage de la variable, par exemple.

La technique que je vous propose ici est inédite, simple et 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.

Nous faisons un contrôle avec "in_array($File2Download,$ListeDownload)" : si $_GET est "bricolé" par un internaute qui tenterait de télécharger autre chose que les fichiers proposés, il n'y a pas de téléchargement et accessoirement on pourrait afficher un message ("The file you want to download is gone to lunch!").

En effet, seuls les fichiers qui sont dans la liste  $ListeDownload pourront être téléchargés.

La contrainte, c'est qu'à chaque fois que vous ajoutez un nouveau fichier dans le répertoire de téléchargement, il faudra compléter la variable "$ListeDownload".

Pour remedier à cette contrainte, on peut aussi charger dynamiquement la variable "$ListeDownload" en lisant le contenu du répertoirer "$RepDownload".

Dans ce cas, il suffit de remplacer :

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

par :
 
$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

Les commentaires sont fermés.