Bonjour à tous
sur le site de ma boite, pour proposer un fichier au telechargement de manière sécurisée, on appelle un fichier telecharger.php avec le nom du fichier en parametre, fichier qui est situé dans un répertoire auquel le serveur web n'a pas accès. Le script php ouvre le fichier en lecture et écrit son contenu dans la sortie vers le serveur http, de cette manière :
$nom=$HTTP_GET_VARS["nom"];
$fichier=fopen("/files/$nom","rb");
header("Content-Type: application/octetstream");
header("Content-Disposition: filename=$nom");
fpassthru($fichier);
Sur certains fichiers, le script échoue 4 fois sur 5
Quelqu'un connait-il des raisons possibles d'un tel comportement ?
plus généralement, que pensez-vous de ce code ? quelle est la meilleure méthode pour ce genre de manipulation ?
des problèmes de charge peuvent-ils empécher php d'ouvrir un fichier ?
pour info, j'utilise une fedora core 1 à jour
# Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Hardy Damien . Évalué à 2.
$nom=$HTTP_GET_VARS["nom"];
header("Content-type: application/octetstream");
header("Content-disposition: filename=$nom");
readfile($fichier);
Damien
# Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Colin Leroy (site web personnel) . Évalué à 4.
[...]
$fichier=fopen("/files/$nom","rb");
Sécurisée?
http://example.com/telecharger.php?nom=../etc/passwd(...)
Il faut filtrer '/' et '..' (au moins) pour que ce soit sécurisé (même si ton serveur est chrooté, sinon tu peux toujours choper des sources php par ce biais, possiblement avec un mot de passe de base dedans, etc).
Sinon, c'est "application/octet-stream", peut-être que ça peut aider.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Nap . Évalué à 1.
merci à tous les deux, je vais filer ça au webmaster :)
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Prae . Évalué à 1.
donne nous l'url tient au passage >-)
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Nap . Évalué à 2.
vu que les noms des fichiers auxquels chacun a accès vont être stockés dans une base, et comparés avec le nom passé pour vérifier les droits d'accès, Ça Peut Pas Arriver (tm)
# Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Moby-Dik . Évalué à 2.
$fichier=fopen("/files/$nom","rb");
Tu fais pas de vérifications sur le contenu de $nom, au cas où ?
Sur certains fichiers, le script échoue 4 fois sur 5
Fais des tests avec curl pour débugger ?
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Nap . Évalué à 1.
en fait on est en train de tester tout ça, et après de toute manière on vérifie forcément le $nom, vu qu'on vérifie que l'utilisateur y a bien accès
mais avant tout on teste la méthode
# Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Lol Zimmerli (site web personnel, Mastodon) . Évalué à 3.
Euh, tu voulais dire octet-stream? Mais bon, ça change rien à l'affaire. QU'entends-tu par 'le script échoue'? 'DOcument contains no data'?
Tiens, je roupille sur ma touche Maj moi...
La gelée de coings est une chose à ne pas avaler de travers.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par cumulus . Évalué à 1.
Ne faudrait-il pas déterminer le type de fichier (doc, jpg, ..) avant d'envoyer un header adapté ?
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Lol Zimmerli (site web personnel, Mastodon) . Évalué à 1.
Ex: http://www.lzi.ch/picts/(...)
clique sur le anyb.glup (c'est un cp du png).
Chez moi, il me propose de le sauver sur le DD, alors que dans le httpd.conf, j'ai:
DefaultType text/plain
Non?
La gelée de coings est une chose à ne pas avaler de travers.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par cumulus . Évalué à 1.
http://cumulus.nerim.net/divers/glub.png(...)
Ca dépend peut-être du navigateur alors ?!
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Lol Zimmerli (site web personnel, Mastodon) . Évalué à 1.
La gelée de coings est une chose à ne pas avaler de travers.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Nap . Évalué à 1.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Lol Zimmerli (site web personnel, Mastodon) . Évalué à 2.
$nom=$HTTP_GET_VARS["nom"];
$fichier=fopen("/files/$nom","rb");
exit("Content-Type: application/octetstream");
header("Content-Disposition: filename=$nom");
fpassthru($fichier);
puis
$nom=$HTTP_GET_VARS["nom"];
$fichier=fopen("/files/$nom","rb");
header("Content-Type: application/octetstream");
exit("Content-Disposition: filename=$nom");
fpassthru($fichier);
Tu devrais pouvoir contrôler que les headers sont bien construits
La gelée de coings est une chose à ne pas avaler de travers.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Hardy Damien . Évalué à 1.
Dam
# Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Hojo . Évalué à 1.
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Nap . Évalué à 1.
# Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Laurent J (site web personnel, Mastodon) . Évalué à 4.
header("Content-type: application/force-download" );
header('Content-disposition: attachment; filename="'. $ficname.'\";');
header("Content-Description: File Transfert");
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
header("Content-Length: ".filesize($ficname));
flush();
//envoi du fichier proprement dit
readfile($ficname);
exit;
ça fonctionne avec tout navigateur en principe
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Laurent J (site web personnel, Mastodon) . Évalué à 3.
$ficname = le nom du fichier sur le système, avec eventuellement son chemin...
et en fait, la deuxième ligne est fausse. on indique pas $ficname (surtout si il contient un chemin, mais le nom sous lequel on veut qu'il soit enregistré sur la machine de l'utilisateur
header('Content-disposition: attachment; filename="'. $ficnametosave.'\";');
on peut donc avoir :
$ficnametosave='toto.sxi';
et
$ficname = '/path/to/real/file/ab15fs21';
[^] # Re: téléchargement contrôlé de fichiers avec apache2 et php4
Posté par Nap . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.