begin process at 2012 02 05 02:22:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

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

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


 Information sur la source

Note :
5 / 10 - par 1 personne
5,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Classé sous :téléchargement, forcer, fichier Niveau :Débutant Date de création :02/11/2006 Date de mise à jour :05/10/2007 18:06:15 Vu / téléchargé :14 342 / 763

Auteur : michmichman

Ecrire un message privé
Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce code sert à forcer le téléchargement d'un fichier (pratique pour les .txt .mp3 ...)que le navigateur essay de lancer tout seul alors que vous avez pas envie.

Source

  • <?PHP
  • ini_set("memory_limit","50M");//taille max du fichier
  • if (isset($fichier_forc)) {//verification que la variable a bien été envoyée
  • $fichier=$fichier_forc;
  • $ext=substr(strrchr($fichier,"."),1);
  • header('Content-disposition: attachment; filename='.$fichier.'');
  • switch($ext){//ici ajouter les types de fichier pour cela lancer regedit,developper le dossier "HHEY_CLASSES_ROOT" selectionner l'extention désirée en regarder la colonne "données" de la clée Content Type
  • case 'exe': header("Content-Type: application/force-download");
  • case 'zip': header("Content-Type: application/x-zip-compressed");
  • case 'mp3': header("Content-Type: audio/mpeg");
  • case 'txt': header("Content-Type: texte/plain");
  • }
  • readfile($fichier);//lecture du fichier
  • }else{
  • echo 'Erreur dans le traitement du fichier';
  • }
  • ?>
<?PHP
ini_set("memory_limit","50M");//taille max du fichier
if (isset($fichier_forc)) {//verification que la variable a bien été envoyée
$fichier=$fichier_forc;
$ext=substr(strrchr($fichier,"."),1);
header('Content-disposition: attachment; filename='.$fichier.'');
switch($ext){//ici ajouter les types de fichier pour cela lancer regedit,developper le dossier "HHEY_CLASSES_ROOT" selectionner l'extention désirée en regarder la colonne "données" de la clée Content Type
case 'exe': header("Content-Type: application/force-download");
case 'zip': header("Content-Type: application/x-zip-compressed");
case 'mp3': header("Content-Type: audio/mpeg");
case 'txt': header("Content-Type: texte/plain");
}
readfile($fichier);//lecture du fichier
}else{
echo 'Erreur dans le traitement du fichier';
}
?>

 Conclusion

Ce code est la synthèse de tout ce qui a été dit dans le code de: "ejbye7" je remercie toutes les personne qui ont participé a ce code très utile (pensé personnelle)!!
Krankelune a posté une version d'un script du meme type sur cette page.Je le remercie dailleurs. Prennez son code qui est beaucoup plus sécurisé.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

05 octobre 2007 18:04:55 :
Script mal sécurisé et comportant des erreures
05 octobre 2007 18:06:15 :
Script mal/pas sécurisé et comportant des erreurs.

 Sources de la même categorie

Source avec Zip Source avec une capture GENERATEUR D'ONGLET DE NAVIGATION PHP par pos123
FORMATER UN LIEN YOUTUBE, DAILYMOTION OU VIMEO POUR L'UTILIS... par kgb93
Source avec Zip Source avec une capture PAGINATION + FICHIER CSS par profdi
Source avec Zip Source avec une capture SYSTEME D'AUTHENTIFICATION PHP AVEC PROTÉCTION KEYLOGGER par mtrix000
Source avec Zip Source avec une capture GENERATEUR DE BOUTONS DE PARTAGES POUR RESEAUX SOCIAUX par cod57

 Sources en rapport avec celle ci

CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PA... par raizzo
COMPTEUR DE VISITES SUR FICHIER par pierreSabatier
Source avec Zip PROTÉGEZ VOS LIENS DE TÉLÉCHARGEMENT PAR MOT DE PASSE ET/OU ... par unlien
FORCER LE TÉLÉCHARGEMENT D'UN FICHIER SIMPLEMENT par sean1305

Commentaires et avis

Commentaire de kankrelune le 02/11/2006 13:23:16

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();

?>

Commentaire de michmichman le 02/11/2006 14:29:20

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!!

Commentaire de kankrelune le 02/11/2006 14:51:19

"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°

Commentaire de michmichman le 02/11/2006 14:55:15

La je doit avouer que je suis un gros naz !!

Commentaire de jean84 le 02/11/2006 15:53:57

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 ^^

Commentaire de kankrelune le 02/11/2006 18:01:50

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)

Commentaire de jean84 le 04/11/2006 18:00:02

Oki merci pour les infos :p

Commentaire de bouillbou le 02/05/2007 14:52:20

Merci KANKRELUNE ton script est excellent.

Commentaire de gloupi le 05/05/2007 14:44:16

Un grand merci ! Ca marche nickel !

Commentaire de pwepwe973 le 24/05/2007 23:00:53

y' a-t-il un moyen de télécharger dans un répertoire situé dans un serveur externe externe ? merci beaucoup

Commentaire de pwepwe973 le 24/05/2007 23:03:23

merci d'avance lol

Commentaire de kankrelune le 25/05/2007 15:32:06

Oui tu redirige vers le serveur en question sur lequel se trouvera ce script là... .. .

@ tchaOo°

Commentaire de pwepwe973 le 03/06/2007 04:10:55

merci kankrelune d'avoir repondu à mon message

Commentaire de pwepwe973 le 06/08/2007 15:31:44

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 ?

Commentaire de michmichman le 07/08/2007 17:16:40

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

Commentaire de pwepwe973 le 13/08/2007 18:28:46

Ha ok, j'ai pris celui de kankrelune merci beaucoup

Commentaire de aarb le 19/08/2007 00:17:53

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.... ;)

Commentaire de michmichman le 19/08/2007 13:15:45

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

Commentaire de izirezo le 01/10/2007 16:46:26

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 !

Commentaire de michmichman le 05/10/2007 18:07:52

Lis le poste précédent qui traite exactement ce que tu demande.

Commentaire de pwepwe973 le 03/02/2008 13:25:35

peut-on lister les fichiers par ordre alphabétique?
Merci d'avance !

Commentaire de lawat le 27/06/2009 09:26:08

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

Commentaire de museumdive le 05/04/2011 03:30:46

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Forcer un téléchargement plutôt que l'ouverture d'un fichier [ par Adagyo ] Salut,Je voudrais forcer mes utilisateur à télécharger un fichier (un fichier .csv dans mon cas) plutôt qu'il s'ouvre avec excel dans le navigateur.Co Forcer le téléchargement et fermer la fenêtre !! [ par djagger ] Lussss !Voici mon pb :je force le téléchargement d'un fichier :&lt;?php$file = "fichier.txt";// téléchargement du fichierheader("Content-Type: applica forcer le téléchargement et espaces dans le fichier [ par arginine ] Bonjour,J'utilise le bout de code suivant pour "forcer le t&#233;l&#233;charmenet d'un fichier": Fichier dowload.php &lt;?phpheader("Content-type: app Forcer le téléchargement d'un fichier [ par hood042 ] Bonjour, je voudrais forcer le téléchargement d'un fichier comme sur ce site : http://dimi30a.olympe-network.com/free.phpPouvez-vous m'aider ? Merci p forcer le téléchargement d'un MP3 [ par lawebmachine ] Bonjour Je cherche à forcer le téléchargement des MP3 sur le site que je fais. Seulement ça me met un message d'erreur. Qui peut m'aider ? voici le PHP : téléchargement *.zip [ par wolfoxrocks ] Bonjour à toutes et à tous, je me permet de vous embêter un ch'tit peu pour vous demander un coup de pouce.Avant tout je ne maîtrise pas le php, mais Forcer à télécharger un fichier avec onClick [ par raskar97one ] Bonjour à tous,Dans mon site j'utilise un format de fichier peu connu.(stbe)Lorsque je met un lien pour télécharger celui-ci, firefox essaye de le lir Lancer le téléchargement d'un .exe [ par N3N3SS ] Bonjour tout le monde, J'ai fini de créer mon site, j'y propose le téléchargement d'un exécutable, calculette de windows pour les tests. J'ai dans m Téléchargement à la volée [ par BananaTree ] Bonjour, je n'arrive pas à forcer le téléchargement d'un fichier texte généré à la volée. je ne souhaite pas que ce fichier soit enregistré sur le se Forcer le téléchargement [ par djimson ] Bonjour, De l'aide pour ce script: En fait, je veux forcer le téléchargement des fichiers envoyer par FTP dans le répertoire COURS. Alors, j'arrive à


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,886 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales