Journal : téléchargement contrôlé de fichiers avec apache2 et php4

Posté par Nap () le 19 mars 2004
0
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

> Lire le journal (20 commentaires, moyenne: 1,7).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Re: téléchargement contrôlé de fichiers avec apache2 et php4

Posté par Hardy Damien (page perso, ) le 19/03/2004 à 15:28. (lien). Évalué à 2.

autre solution :

$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 (page perso, ) le 19/03/2004 à 15:32. (lien). Évalué à 4.

telechargement de manière sécurisée
[...]
$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.

--
Claws Mail - it bites!
  • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

    Posté par Nap () le 19/03/2004 à 15:33. (lien). Évalué à 1.

    mais c'est pas bête tout ça :))

    merci à tous les deux, je vais filer ça au webmaster :)

    • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

      Posté par Benjamin G. ( Prae ) (page perso, ) le 19/03/2004 à 16:09. (lien). Évalué à 1.

      /me se tape le front avec la main

      donne nous l'url tient au passage >-)

      • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

        Posté par Nap () le 19/03/2004 à 16:11. (lien). Évalué à 2.

        nan mais en fait j'ai été un peu vite

        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 () le 19/03/2004 à 15:34. (lien). Évalué à 2.

$nom=$HTTP_GET_VARS["nom"];
$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 () le 19/03/2004 à 15:43. (lien). Évalué à 1.

    Tu fais pas de vérifications sur le contenu de $nom, au cas où ?

    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 (Jabber id, page perso, ) le 19/03/2004 à 15:34. (lien). Évalué à 3.

header("Content-Type: application/octetstream");

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

--
En fait, Bernardo n'était pas muet; c'est Zorro qui était sourd.
  • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

    Posté par cumulus () le 19/03/2004 à 15:46. (lien). Évalué à 1.

    Je crois que dans le cas d'un échec, le client ne sait pas quoi faire du fichier, du coup pour une image png par exemple, il va t'afficher de l'ascii dans ton navigateur.

    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 (Jabber id, page perso, ) le 19/03/2004 à 16:09. (lien). Évalué à 1.

      Normalement pas, non. Apache devrait savoir, s'il ne sait pas quoi faire du fichier, te l'envoyer en 'save as..'.

      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?

      --
      En fait, Bernardo n'était pas muet; c'est Zorro qui était sourd.
      • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

        Posté par cumulus () le 19/03/2004 à 20:58. (lien). Évalué à 1.

        Sous Mozilla 1.5 il me l'affiche direct en ascii :

        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 (Jabber id, page perso, ) le 22/03/2004 à 10:28. (lien). Évalué à 1.

          Si ton navigateur ne peut pas afficher le .glup, c'est une chose; mais qu'il ne puisse pas afficher le PNG, alors c'est _ton_ navigateur qui a un problème!

          --
          En fait, Bernardo n'était pas muet; c'est Zorro qui était sourd.
  • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

    Posté par Nap () le 19/03/2004 à 16:07. (lien). Évalué à 1.

    en fait sous mozilla il ne se passe absolument rien, après un furtif sablier, et sous IE, du bouton droit + enregistrer sous, il y a une erreur du genre "le serveur n'a rien répondu"

    • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

      Posté par Lol Zimmerli (Jabber id, page perso, ) le 19/03/2004 à 16:12. (lien). Évalué à 2.

      Essaie de remplacer successivment le 1er puis que le 2èm 'header' par un 'exit':

      $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

      --
      En fait, Bernardo n'était pas muet; c'est Zorro qui était sourd.
      • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

        Posté par Hardy Damien (page perso, ) le 19/03/2004 à 16:14. (lien). Évalué à 1.

        C'est pas idiot en l'occurence je crois me souvenir que PHP construit le header a l'envers donc mettre p.e. le Content-Type apres le Content-Disposition dans le source.

        Dam

Re: téléchargement contrôlé de fichiers avec apache2 et php4

Posté par Hojo () le 19/03/2004 à 16:26. (lien). Évalué à 1.

pense aussi à faire un flush.

  • [^]Re: téléchargement contrôlé de fichiers avec apache2 et php4

    Posté par Nap () le 19/03/2004 à 19:05. (lien). Évalué à 1.

    c koi ça ? (désolé je suis un nOOb là)

Re: téléchargement contrôlé de fichiers avec apache2 et php4

Posté par Laurent J (page perso, ) le 19/03/2004 à 16:44. (lien). Évalué à 4.

La bonne manière de faire pour forcer un téléchargerment de fichier (avec l'ouverture de la boite de dialogue "enregistrer sous" dans le navigateur)

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 (page perso, ) le 19/03/2004 à 16:47. (lien). Évalué à 3.

    j'ai oublié de précisé :

    $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 () le 19/03/2004 à 19:07. (lien). Évalué à 1.

      merci beaucoup !!

Revenir en haut de page