Help, probleme pour ouvrir un fichier du serveur ou le telecharger avec php

Signaler
Messages postés
144
Date d'inscription
mercredi 3 février 2010
Statut
Membre
Dernière intervention
3 novembre 2010
-
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010
-
Bonsoir,

J'ai déjà eu un problème pour la suppression du fichier, vous m'êtes venus en aide  et je vous en remercie, maintenant cela fait quelques jours que je me prends la tête pour pouvoir réussir à ouvrir ou télécharger les fichiers contenus dans un dossier sur le serveur.

Voici le code que je tente d'utiliser:

Code de la page sur laquelle est affichés les fichiers sauvegardés sur le serveur:

Liste des fichiers
      <table border= "1" bordercolor="#FFFFFF">
        <tr>
<th>nom</th>
<th>Supprimer</th>
<th>Ouvrir</th>
</tr>      
        <?php
       
if ($handle = opendir('upload_fichier')) {    while (false !($file readdir($handle))) {
        if ($file != "." && $file != "..") {?>
<tr><td><?php  echo "$file\n";?></td>
<td><?php echo '[delete.php?file=' . urlencode($file) . ' '; ?> Supprimer]</td>
<td><?php echo '[ouvrir.php?file=' . urlencode($file) . ' '; ?>Ouvrir]</td>
</tr>
<?php
        }
    }
    closedir($handle);
}

?>

Code de la page ouvrir.php:

<?php
$file = "dossier_fichier/".$_GET["file"];

header("Content-Type: application/force-download");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename=".$file);
readfile($file);

?>

Merci de me venir en aide

Bonne soirée

Seb

8 réponses

Messages postés
144
Date d'inscription
mercredi 3 février 2010
Statut
Membre
Dernière intervention
3 novembre 2010

J'ai oublié, les fichiers sont de tous formats: xls, pdf, doc....

Encore merci

Seb
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

pourquoi dans un cas tu lis les fichiers dans 'upload_fichier', et dans l'autre, dans 'dossier_fichier'? Ton fichier est soit dans l'un, soit dans l'autre, à priori.
Messages postés
144
Date d'inscription
mercredi 3 février 2010
Statut
Membre
Dernière intervention
3 novembre 2010

Bonsoir,

Le dossier est 'upload_fichie'r, j'avais corrigé cette erreur sur le serveur, mais pas dans mon message.
Pourquoi ça ne marche pas?

Merci de votre aide

Seb
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

Petite remarque avant de commencer :
pense à filtrer la variable $file, sinon n'importe qui peut accéder à n'importe quel fichier de ton serveur; un exemple :
ouvrir.php?file=../ouvrir.php me renvoie la source de ton fichier.
Ce n'est pas très grave ? Ok, un autre exemple alors :
ouvrir.php?file=../../../etc/passwd ... quelques essais pour ajuster le nombre de ../, et un joli fichier normalement pas accessible.
(C'est encore plus drôle avec supprimer !)

Venons-en au problème lui-même :
"Ca ne marche pas" = ?

Il s'agit d'ailleurs d'une remarque générique, qui pourrait être placée dans les "guidelines" d'écriture d'un message (si quelqu'un qui se sent concerné, du genre un admin, lit ça...) :
"Ca ne marche pas" ne veut rien dire.
S'agit-il :
- d'un message d'erreur ? (lequel ? généré à quel moment ?)
- d'un comportement qui n'est pas celui attendu ? (quel est le comportement attendu ? celui obtenu ?

Tout le monde peut y gagner si les messages sont explicites en indiquant dans l'ordre :
- le code (ça, il y est, y a pas de problème)
- l'opération effectuée ("quand je charge ma page toto.php")
- le comportement attendu ("je devrais voir ceci")
- le comportement obtenu (j'ai tel message d'erreur, il se passe cela..)
Messages postés
144
Date d'inscription
mercredi 3 février 2010
Statut
Membre
Dernière intervention
3 novembre 2010

Bonjour,

Merci de répondre à mon message, je m'excuse que celui ci soit trop flou pour que vous puissiez me répondre.

[quote= yopai_v]Petite remarque avant de commencer :
pense à filtrer la variable $file, sinon n'importe qui peut accéder à n'importe quel fichier de ton serveur; un exemple :
ouvrir.php?file=../ouvrir.php me renvoie la source de ton fichier.
Ce n'est pas très grave ? Ok, un autre exemple alors :
ouvrir.php?file=../../../etc/passwd
... quelques essais pour ajuster le nombre de ../, et un joli fichier
normalement pas accessible.
(C'est encore plus drôle avec supprimer !) /quote
Dois je quand même filtrer si les dossiers sont protégés par htaccess?

[quote=yopai_v] Tout le monde peut y gagner si les messages sont explicites en indiquant dans l'ordre :
- le code (ça, il y est, y a pas de problème)
- l'opération effectuée ("quand je charge ma page toto.php")
- le comportement attendu ("je devrais voir ceci")
- le comportement obtenu (j'ai tel message d'erreur, il se passe cela..) /quote

Le résultat attendu est lorsque je suis sur la page visualiser, je vois les fichiers disponibles et quand je clique sur ouvrir à coté du fichier voulu, celui ci s'ouvre ou se télécharge sur l'ordinateur. donc pour cela lorsque l'on clique sur ouvrir, l'action est <td><?php echo '[ouvrir.php?file=' . urlencode($file) . ' '; ?>Ouvrir]</td>
la page ouvrir.php s'affiche et il y a des messages d'erreurs: Warning : Cannot modify header information - headers already sent
by (output started at
/mnt/167/sda/4/f/letheatreenherbe/zone_privee/ouvrir.php:14) in /mnt/167/sda/4/f/letheatreenherbe/zone_privee/ouvrir.php on line 46

Warning: Cannot modify header information - headers already sent
by (output started at
/mnt/167/sda/4/f/letheatreenherbe/zone_privee/ouvrir.php:14) in /mnt/167/sda/4/f/letheatreenherbe/zone_privee/ouvrir.php on line 47

Warning: Cannot modify header information - headers already sent
by (output started at
/mnt/167/sda/4/f/letheatreenherbe/zone_privee/ouvrir.php:14) in /mnt/167/sda/4/f/letheatreenherbe/zone_privee/ouvrir.php on line 48

ÐÏ�11;ࡱ�1A;á????????????????>?�3;?þÿ
?�6;???????????�8;???m�1;???????�10;??w�1;??�1;???þÿÿÿ????j�1;??k�1;??l�1;??z�1;??ø�1;??v�2;??÷�2;??H�3;??ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Á?q`
�4;??ø�12;¿??????0?????�6;??øI??�E;?bjbjqPqP??????????????????�C;�4;�16;?’Ã�2;?�13;:�1;?�13;:�1;?S�12;??????????????????????ñ???????ÿÿ�F;?????????ÿÿ�F;?????????ÿÿ�F;
Après tous ces signes nous pouvons voir quelques lignes de mon document.
Les lignes incriminées par les "Warning" sont:
header("Content-Type: application/force-download");
header("Content-Length: ".filesize($file));
header("Content-Disposition: attachment; filename =".$file);

Que dois je faire pour que le document s'ouvre dans une autre page ou que la personne puisse télécharger le fichier.

Merci
Bonne journée

Seb
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

le message te dit que tu as envoyé un affichage ligne 14 ans ouvrir.php.
Tu ne nous as pas montré la totalité du script ouvrir.php.
Tu devrais lire quelques tutos sur les headers, il y en a un sur ce site : une fois qu'un output a été fait, on ne peut plus envoyé d'en-tête au navigateur.
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

> Dois je quand même filtrer si les dossiers sont protégés par htaccess?
Non pour 2 raisons :
* la config htaccess ne protège l'accès qu'au répertoire web
* et puis surtout, c'est ton script php qui va récupérer le fichier, et lui n'est pas limité par le htaccess
De toute manière, ton raisonnement est incomplet en terme de sécurité :
il est possible que le htaccess, ou la configuration de php, fournisse la "glissière de sécurité" qui va empêcher le système de délivrer ses secrets; mais une chose importante en conception logicielle est de ne pas se reposer sur la présence d'une glissière de sécurité.
Quelle que soit la configuration du serveur, ton appli (composée uniquement du code Php) ne doit pas permettre d'accéder à des fichiers qui n'ont rien à voir... La glissière de sécurité est là par exemple pour éviter l'exploitation d'une faille dans php.

De manière générale, il faut valider toute entrée de ton script. Ici, je te dirais soit de chasser les / et \ de ton nom de fichier, soit de faire un realpath() sur le fichier obtenu, et de vérifier que le début est le  realpath() de ton dossier.
Messages postés
47
Date d'inscription
jeudi 7 septembre 2006
Statut
Membre
Dernière intervention
21 avril 2010

Pour ton problème proprement dit, je rejoins la réponse de malalam...
Et pour enfoncer le clou : (dans la suite des recommandations valables pour tout le monde)
Quand un message d'erreur indique un fichier et une ligne, c'est bien de regarder cette ligne-là d'abord, et d'en faire part aux gens à qui on demande de l'aide :-)

> pour que le document s'ouvre dans une autre page ou que la personne puisse télécharger le fichier.
Ton code (le Content-Type:applicaton/force-download) est fait pour dire au navigateur que c'est un fichier à télécharger; pour ouvrir dans une nouvelle fenêtre il faut renvoyer le Content-Type qui correspond au type de ton document (et faire un target="_blank" sur le lien, ou un window.open en javascript, pour que ce soit une nouvelle fenêtre). Enfin, tel que tu poses la question, je suppose que c'est "n'importe, pourvu que ça marche"; mais mieux tu comprendras ce que tu fais, plus vite tu apprendras.