Help, probleme pour ouvrir un fichier du serveur ou le telecharger avec php
sebing
Messages postés144Date d'inscriptionmercredi 3 février 2010StatutMembreDernière intervention 3 novembre 2010
-
28 nov. 2008 à 22:08
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 avril 2010
-
1 déc. 2008 à 00:25
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
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 29 nov. 2008 à 14:31
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.
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 avril 2010 30 nov. 2008 à 10:44
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..)
Vous n’avez pas trouvé la réponse que vous recherchez ?
sebing
Messages postés144Date d'inscriptionmercredi 3 février 2010StatutMembreDernière intervention 3 novembre 2010 30 nov. 2008 à 11:15
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;???m1;???????10;??w1;??1;???þÿÿÿ????j1;??k1;??l1;??z1;??ø1;??v2;??÷2;??H3;??ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿì¥Á?q`
4;??ø12;¿??????0?????6;??øI??E;?bjbjqPqP??????????????????C;4;16;?’Ã2;?13;:1;?13;:1;?S12;??????????????????????ñ???????ÿÿ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.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 30 nov. 2008 à 11:29
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.
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 avril 2010 1 déc. 2008 à 00:04
> 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.
yopai_v
Messages postés47Date d'inscriptionjeudi 7 septembre 2006StatutMembreDernière intervention21 avril 2010 1 déc. 2008 à 00:25
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.