FORCER UN TÉLÉCHARGEMENT (REPRISE DU CODE DE "EJBYE7"), ON SYNTHÉTISE !!

kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015 - 2 nov. 2006 à 13:23
museumdive Messages postés 1 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 5 avril 2011 - 5 avril 2011 à 03:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40181-forcer-un-telechargement-reprise-du-code-de-ejbye7-on-synthetise

museumdive Messages postés 1 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 5 avril 2011
5 avril 2011 à 03:30
Exact, le script ne fonctionne pas sur IE.
Sinon je cherchais une alternative qui permettrait d'avoir une variable à la place du nom du répertoire des fichiers.
lawat Messages postés 6 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 27 juin 2009
27 juin 2009 à 09:26
Ok kankrelune,

ton script fonctionne parfaitement sur Firefox. Mais sur IE, il ne fait qu'afficher le fichier dans explorer.

As-tu la correction?

Merci d'avance
cs_pwepwe973 Messages postés 7 Date d'inscription samedi 23 décembre 2006 Statut Membre Dernière intervention 3 février 2008
3 févr. 2008 à 13:25
peut-on lister les fichiers par ordre alphabétique?
Merci d'avance !
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
5 oct. 2007 à 18:07
Lis le poste précédent qui traite exactement ce que tu demande.
izirezo Messages postés 1 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 1 octobre 2007
1 oct. 2007 à 16:46
Bonjour,

Je débute en php (disons que je bidouille plus ou moins "au pif" les scripts que j'utilise quand je ne peux pas faire autrement) et je ne sais pas comment indiquer au script de kankrelune le nom et le path des fichiers dans le passage :

/** path du répertoir contenant les fichiers (à éditer) **/
define('DOWNLOAD_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR);

Est-ce que vous pourriez m'éclairer ?

Merci d'avance !
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
19 août 2007 à 13:15
Bonjour,
Je ne te donne pas la réponse toute faite car je ne suis pas certain de la réponse que je pourrais te donner étant autodidacte moi aussi par contre je peut te conseiller le site suivant afin de comprendre les différentes fonctions utilisées.
Pour les fonction:
http://www.php.net/manual/fr/function.dirname.php (ca c'est pour la fonction dirname()) tu pourra chercher la fonction define().
Pour les variables __FILE__ et DIRECTORY_SEPARATOR ce sont des variables constantes:
http://fr.wikibooks.org/wiki/Programmation_PHP/Constantes (on revoi les types de variables, ca m'a pas fait de mal non plus) DIRECTORY_SEPARATOR renvoi un "" ou un "/" selon l'OS.
Voila j'espere que tu t'en tireras avec cette documentation.

Michmichman
aarb Messages postés 4 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 19 août 2007
19 août 2007 à 00:17
salut a tous et toi kankrelune

cela faisit un bon moment que je recherchais un script de ce genre pour sécuriser le telechragement de fichiers sur mon site! mais je vais etre honnete avec vous , je suis un autodidacte et assez lent, pardon pour cela. je voudrais juste que tu mexplique comment éditer justement les lignes:

"/** path du répertoir contenant les fichiers (à éditer) **/
define('DOWNLOAD_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR);
"
afin que cela fonctionne sur mon site

exemple nom du site, monsite.com
nom du dossier contenant les fichiers a telecharger, mondossier
et pour finir nom du fichier, monfichier!

je sais que cela peu ^paraitre abérant pour certain, mais je ne demande qu'a apprendre, donc si tu pouvais avoir l'amabilité de me montrer la marche a suivre je te serais pleinement reconnaissant!!!!
merci d'avance et bonne continuation...... aar'b.... ;)
cs_pwepwe973 Messages postés 7 Date d'inscription samedi 23 décembre 2006 Statut Membre Dernière intervention 3 février 2008
13 août 2007 à 18:28
Ha ok, j'ai pris celui de kankrelune merci beaucoup
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
7 août 2007 à 17:16
Utilise tu bien le code de "kankrelune" car le mien n'est pas sécurisé et est plutot mauvais et je sais que chez Free par exemple si tu ne met pas cette partie:
if(isset($_GET['file']))
$file = $_GET['file'];
elseif(isset($_POST['file']))
$file = $_POST['file'];

Le passage des variable de marche qu'une fois sur deux
cs_pwepwe973 Messages postés 7 Date d'inscription samedi 23 décembre 2006 Statut Membre Dernière intervention 3 février 2008
6 août 2007 à 15:31
bonjour je suis la pour signaler une petite erreur du scripte les fichier sans télécharger à moitié une fois sur deux !

il y a-t-il une solution contre ce problème ?
cs_pwepwe973 Messages postés 7 Date d'inscription samedi 23 décembre 2006 Statut Membre Dernière intervention 3 février 2008
3 juin 2007 à 04:10
merci kankrelune d'avoir repondu à mon message
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
25 mai 2007 à 15:32
Oui tu redirige vers le serveur en question sur lequel se trouvera ce script là... .. .

@ tchaOo°
cs_pwepwe973 Messages postés 7 Date d'inscription samedi 23 décembre 2006 Statut Membre Dernière intervention 3 février 2008
24 mai 2007 à 23:03
merci d'avance lol
cs_pwepwe973 Messages postés 7 Date d'inscription samedi 23 décembre 2006 Statut Membre Dernière intervention 3 février 2008
24 mai 2007 à 23:00
y' a-t-il un moyen de télécharger dans un répertoire situé dans un serveur externe externe ? merci beaucoup
cs_gloupi Messages postés 2 Date d'inscription dimanche 21 mai 2006 Statut Membre Dernière intervention 5 mai 2007
5 mai 2007 à 14:44
Un grand merci ! Ca marche nickel !
cs_bouillbou Messages postés 4 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 16 mars 2010
2 mai 2007 à 14:52
Merci KANKRELUNE ton script est excellent.
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
4 nov. 2006 à 18:00
Oki merci pour les infos :p
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
2 nov. 2006 à 18:01
Un hotlink est un lien d'un site externe vers un fichier de ton site généralement un fichier à télécharger ou une image... .. .

La constante DIRECTORY_SEPARATOR est définie par php elle correspond au separateur de répertoire pour les path physique (\ pour windows / pour linux) à utiliser pour tous les path physiques (inclusions, fopen en local, etc) ça évite soit les erreurs de chemins soit d'avoir à chercher sous quel OS tourne php... .. . ;o)

@ tchaOo°

ps : bon peut être mais je suis loin d'être très bon... j'en apprend encore tous les jours... .. . ;o)
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
2 nov. 2006 à 15:53
Non non, c'est Kankrelune qui est tres bon ;-)

"Et si un petit malin fait un hotlink sur la page et que le fichier est supprimé ou renomé entre temps... si un petit malin veut faire une injection de code pour modifier les header ou pour essayer de récupérer le path physique du site en provoquant l'affichage d'une erreur dans le but de réutiliser ce dernier dans une attaque... .. . ;o)"
J'ai pas trop comrpis ce que tu essaye de dire par HOT LINK ? Et DIRECTORYP SEPRATOR, c'est une constante a toi ou cela existe vraiment ?

Merci ^^
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
2 nov. 2006 à 14:55
La je doit avouer que je suis un gros naz !!
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
2 nov. 2006 à 14:51
"La variable $fichier_forc est envoyée par Get"

Et si register_globals est désactivé... .. ? ;o)

Quand à la mettre en post pas forcement autant accepter les deux... .. .

"le fichier existe forcement car il a été listé dans la page précédente."

Et si un petit malin fait un hotlink sur la page et que le fichier est supprimé ou renomé entre temps... si un petit malin veut faire une injection de code pour modifier les header ou pour essayer de récupérer le path physique du site en provoquant l'affichage d'une erreur dans le but de réutiliser ce dernier dans une attaque... .. . ;o)

Ca en fait beaucoups des si... il faut (essayer de) penser à tout... .. .

Concernant l'attaque par directory transversal par exemple imaginons que je fais...

http://www.tonsite.ext/downloads/donwload.php?fichier_forc=../config.php

Si à la racine de ton site (ou ailleur il suffit juste de changer le path dans l'url) tu as un fichier config.php par exemple avec tes identifiants de connection à ta base de donnée je le téléchargerais finger in the nose... .. . ;o)

@ tchaOo°
michmichman Messages postés 79 Date d'inscription jeudi 11 août 2005 Statut Membre Dernière intervention 17 mars 2011
2 nov. 2006 à 14:29
La variable $fichier_forc est envoyée par Get (je devrais sans doute mettre en POST) par la page "répertoire_fichier.php" qui liste le contenue du dossier ou son contenu les fichiers,on verifie la présence de cette variable et le fichier existe forcement car il a été listé dans la page précédente.Il est vrai que je recopier les yeux fermé cette fonction :"ini_set("memory_limit","50M");" du code de "EJBYE7" sans meme verifier je suis donc vraiment pas malin.Sinon pour la sécurité j'avoue que j'y connai rien et je lis ce que tu a mis avec grande attention.
Merci beaucoup de prendre attention aux nouveaux codes qui sortent!!
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
2 nov. 2006 à 13:23
ini_set("memory_limit","50M");

c'est quoi cette abération... mémory_limit ne sert pas à ça... qui plus est tel quel ça risque de générer un warning qui corrompra le fichier téléchargé il serait donc interessant de désactiver le report d'erreur... la taille du fichier n'est pas spécifier dans les en-têtes http... penser à désactiver la compression zlib si elle est activée... éventuellement désactiver la mise en cache... ton code est sensible à une attaque par directory transversal... tu vérifis même pas que le fichier existe et puis d'où vient $fichier_forc ???

bref ça aurait pu être mieux... 5/10 mais ça les vaut tout juste... .. .

Voici la version corrigée... .. .

@ tchaOo°

<?php

/** path du répertoir contenant les fichiers (à éditer) **/
define('DOWNLOAD_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR);

/** on récupère le nom du fichier demandé **/
if(isset($_GET['file']))
$file = $_GET['file'];
elseif(isset($_POST['file']))
$file = $_POST['file'];
else
$file = '';

/** tant qu'a faire évitons les attaques par directory transversal **/
$file = str_replace(array('../','..\\'),'',$file);

/** la variable est elle vide, le fichier existe ? **/
if(empty($file))
exit('Please select a file for download !');
elseif(!is_file(DOWNLOAD_PATH.$file))
exit('Requested file not found !');

function getMimeType($file)
{
$mimes = array(
'hqx' => 'application/mac-binhex40',
'doc' => 'application/msword',
'dot' => 'application/msword',
'bin' => 'application/octet-stream',
'lha' => 'application/octet-stream',
'lzh' => 'application/octet-stream',
'exe' => 'application/octet-stream',
'class' => 'application/octet-stream',
'so' => 'application/octet-stream',
'dll' => 'application/octet-stream',
'pdf' => 'application/pdf',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'smi' => 'application/smil',
'smil' => 'application/smil',
'wbxml' => 'application/vnd.wap.wbxml',
'wmlc' => 'application/vnd.wap.wmlc',
'wmlsc' => 'application/vnd.wap.wmlscriptc',
'xla' => 'application/vnd.ms-excel',
'xls' => 'application/vnd.ms-excel',
'xlt' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'csh' => 'application/x-csh',
'dcr' => 'application/x-director',
'dir' => 'application/x-director',
'dxr' => 'application/x-director',
'spl' => 'application/x-futuresplash',
'gtar' => 'application/x-gtar',
'php' => 'application/x-httpd-php',
'php3' => 'application/x-httpd-php',
'php5' => 'application/x-httpd-php',
'phtml' => 'application/x-httpd-php',
'js' => 'application/x-javascript',
'sh' => 'application/x-sh',
'swf' => 'application/x-shockwave-flash',
'sit' => 'application/x-stuffit',
'tar' => 'application/x-tar',
'tcl' => 'application/x-tcl',
'xhtml' => 'application/xhtml+xml',
'xht' => 'application/xhtml+xml',
'xhtml' => 'application/xml',
'ent' => 'application/xml-external-parsed-entity',
'dtd' => 'application/xml-dtd',
'mod' => 'application/xml-dtd',
'gz' => 'application/x-gzip',
'zip' => 'application/zip',
'au' => 'audio/basic',
'snd' => 'audio/basic',
'mid' => 'audio/midi',
'midi' => 'audio/midi',
'kar' => 'audio/midi',
'mp1' => 'audio/mpeg',
'mp2' => 'audio/mpeg',
'mp3' => 'audio/mpeg',
'aif' => 'audio/x-aiff',
'aiff' => 'audio/x-aiff',
'm3u' => 'audio/x-mpegurl',
'ram' => 'audio/x-pn-realaudio',
'rm' => 'audio/x-pn-realaudio',
'rpm' => 'audio/x-pn-realaudio-plugin',
'ra' => 'audio/x-realaudio',
'wav' => 'audio/x-wav',
'bmp' => 'image/bmp',
'gif' => 'image/gif',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'tiff' => 'image/tiff',
'tif' => 'image/tif',
'wbmp' => 'image/vnd.wap.wbmp',
'pnm' => 'image/x-portable-anymap',
'pbm' => 'image/x-portable-bitmap',
'pgm' => 'image/x-portable-graymap',
'ppm' => 'image/x-portable-pixmap',
'xbm' => 'image/x-xbitmap',
'xpm' => 'image/x-xpixmap',
'ics' => 'text/calendar',
'ifb' => 'text/calendar',
'css' => 'text/css',
'html' => 'text/html',
'htm' => 'text/html',
'asc' => 'text/plain',
'txt' => 'text/plain',
'rtf' => 'text/rtf',
'sgml' => 'text/x-sgml',
'sgm' => 'text/x-sgml',
'tsv' => 'text/tab-seperated-values',
'wml' => 'text/vnd.wap.wml',
'wmls' => 'text/vnd.wap.wmlscript',
'xsl' => 'text/xml',
'mpeg' => 'video/mpeg',
'mpg' => 'video/mpeg',
'mpe' => 'video/mpeg',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'avi' => 'video/x-msvideo',
);

if(false ($pos strrpos($file,'.')))
return isset($mimes[$file]) ? $mimes[$file] : 'application/force-download';

$ext = substr($file,$pos+1);

return isset($mimes[$ext]) ? $mimes[$ext] : 'application/force-download';
}

/**** on désactive les erreurs ****/
error_reporting(0);
/**** on désactive la compression en sortie ****/
ini_set('zlib.output_compression', 0);
$now = time();

/*** Gestion du cache ***/
header('Pragma: public');
header('Last-Modified: '.gmdate("D, d M Y H:i:s").' GMT');
header('Cache-Control: must-revalidate, pre-check=0, post-check=0, max-age=0');

/**** Informations sur la réponse HTTP elle-même ****/
header('Date: '.gmdate("D, d M Y H:i:s", $now).' GMT');
header('Expires: '.gmdate("D, d M Y H:i:s", $now+1).' GMT');
header('Last-Modified: '.gmdate("D, d M Y H:i:s", $now).' GMT');

/**** Informations sur le contenu à envoyer ****/
header('Content-Tranfer-Encoding: none');
header('Content-Length: '.filesize(DOWNLOAD_PATH.$file));
header('Content-Type: '.getMimeType($file).'; name="'.$file.'"');
header('Content-Disposition: attachement; filename="'.$file.'"');

/**** pour finir lecture du fichier ****/
readfile(DOWNLOAD_PATH.$file);
exit();

?>
Rejoignez-nous