Bonjour,
Suite à un besoin de télécharger des médias de mon site (et non de les lires dans un navigateur comme cela est fait par défaut).
Il traîne plusieurs script à travers le web, tous basé à peu près sur le même code, le mieux écris étant peut-être celui là :http://elouai.com/force-download.php
Je l'ai légèrement modelé à ma sauce tout en corrigeant le pb énoncé ici : http://stackoverflow.com/questions/2...nload-on-click
There is a security problem, should closed "application/force-download" Content-Type! which can download anything including server PHP source! – CharlesB
Voici ma version :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php
$filename = $_GET['file'];
$file_extension = strtolower(substr(strrchr($filename,"."),1));
if( $filename != "" )
{
//required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
//
switch( $file_extension )
{
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
case "mp3": $ctype="application/force-download"; break;
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Content-Type: $ctype");
//change, added quotes to allow spaces in filenames
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
}
?> |
Qui possède pourtant le même pb que l'original à savoir :
@CharlesB is right, this would allow you to download anything from the server using directory traversal: <a href="download.php?file=../dbparams.inc>">Download</a>
La suppression du :
default: $ctype="application/force-download";
comme conseiller par CharlesB, n'y ayant rien changer !
Le conseil de sécurité énoncé par elouai, a savoir :
What to do? Use literal values to represent your files that you would access, thus a value of "1" would represent the file xyz.pdf, a value of "2" would represent the file abc.mp3, and so on. Thus the only DOWNLOADABLE files are those specifically HARD-CODED in your script.
N’empêchant pas le pb, puisque il suffit a n'importe qui d'aviser analysant la source de savoir si on utilise ce genre de script pour télécharger un média, et ansi tenter de récupérer n'importe quel autres fichiers coté serveur !
---------------------------------------------------------------------
Voici ma question :
Comment modifier ce script, pour qu'il ne télécharge uniquement que des .jpg, .png, .gif, .mp3 (dans mon cas) et non n'importe quoi tel un fichier .php ou .inc tel que dans l'exemple de OrganicPanda
Merci
Partager