begin process at 2010 09 06 06:11:22
  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é :13 256 / 742

Auteur : michmichman

Ecrire un message privé
Commentaire sur cette source (22)
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

MULTIPLIEZ LES TIMERS SUR VOS SCRIPTS PHP ET BENCHEZ FACILEM... par MonkeyIsBack
Source avec Zip Source avec une capture AFFICHER UNE IMAGE SANS IMAGE (GRÂCE AUX URI) par Astalavista
Source avec Zip EXÉCUTER UN SCRIPT PHP EN TANT QUE SERVICE WINDOW par ig3
Source avec Zip Source avec une capture LOGGER LE TEMPS D'EXÉCUTION DE VOS FONCTIONS PHP par djroulo
LA DIFFÉRENCE ENTRE DEUX DATE EN PLUSIEURS FORMATS par nasro81

 Sources en rapport avec celle ci

Source avec Zip CHARGER DES DONNÉES DEPUIS UN FICHIER TXT DANS UNE BASE DE D... par ig3
Source avec Zip CLASSE SIMPLE DE GESTION DE FICHIERS par alexarbitre
Source avec Zip RÉCUPÉRER LE TYPE D'UN FICHIER (3 FONCTIONS DIFFÉRENTES) par bad_dark_spirit
EFFACER DOSSIERS ET FICHIERS RÉCALCITRANTS par Stephane33
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

 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 Problème au téléchargement d'un fichier (download) [ par beth2611 ] Bonjour, Je rencontre un problème handicapant, sur un site en php, je liste les fichiers dans une balise select, l'utilisateur selectionne un fichier


Nos sponsors


Sondage...

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

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 : 3,978 sec (3)

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