Guest stone Posté 17 Mai 2005 Posté 17 Mai 2005 salut à tous : mon nouveau prob : j'utilise le code suivant pour forcer l'utilisateur à télécharger un fichier : header("Content-Type: application/octet-stream");header("Content-Length: ".filesize($chemin));header("Content-Disposition: attachment; filename=".$chemin);readfile($chemin); Le code fonctionne à la perfection, le seul problème se pose lorsque le nom di fichier contient des spaces. Est-il possible de contourner ce problème sans que l'utilisateur final aie à renommer ses fichiers avant de les uploader merci.
Anonymus Posté 17 Mai 2005 Posté 17 Mai 2005 L'utilisateur final n'a pas à renommer son fichier, c'est ton programme qui doit le faire en aval. Les navigateurs rajoutent des caractères spéciaux pour désigner un espace, ce qui fait que ton code ne sera pas bon, ou plutot 'instable'. Tantot bon, tantot il ne marchera pas. Donc, ton programme ne doit pas avoir à gérer des noms de fichier avec espace, il te faut donc les enlever, avec une fonction du style : $file = str_replace(" ","_",$file); Anonymus.
TheRec Posté 17 Mai 2005 Posté 17 Mai 2005 Si tu tiens vraiment à avoir des fichiers avec des espaces tu peux procéder ainsi... header("Content-Type: application/octet-stream");header("Content-Length: ".filesize($chemin));header("Content-Disposition: attachment; filename=\"".$chemin."\"");readfile($chemin); La différence ce trouve au niveau de "filename". Si tu ne mets le nom de fichier entre guillemets il prendra uniquement la première partie (jusqu'au premier espace, c'est le séparateur dans les valeurs de ce header HTTP) ... Fait attention également avec ce genre de script tu crée facilement des faille de sécurité si le contenu de $chemin est définit par l'url ou par un autre moyen (input hidden , ...). Toutefois si tu test bien tes scripts et que tu isole un minimum tes fichier téléchargeable il ne devrait pas y avoir de problème.
zazi Posté 17 Juin 2005 Posté 17 Juin 2005 Bonjour à tous, Moi j'ai un petit problème avec tout ça. Au départ l'utilisateur upload un fichier. S'il contient un espace, le fichier uploadé contiendra automatiquement un underscore à la place de cet espace, par contre le nom du fichier dans la base sql gardera l'espace. A part ca tout marche bien pour l'upload et j'ai pas trop envie de toucher à ce code. Au moment de récupérer le fichier j'ai suivi les conseils de ce topic. Tout marche sauf bien sûr les fichiers avec espaces... Voilà le code de ma page: <?php$file= 'thumb_'.$row_rs_comprex['DPHO'];$file= str_replace(" ","_",$file);$chemin= 'tatatitatata/'.$file;?>...<A href="download.php?chemin=tatatitatata&file=thumb_<?php echo $row_rs_dev5['DPHO']; ?>">download</A> et le code du download.php: <?header("Pragma: public");header("Expires: 0");header("Cache-Control: must-revalidate, post-check=0, pre-check=0");header("Content-Type: application/force-download");header("Content-Type: application/octet-stream");header("Content-Type: application/download");header("Content-Disposition: attachment; filename=\"".$file."\"");header("Content-Transfer-Encoding: binary");//header("Content-Length: ".filesize($file));readfile($chemin.$file);exit();?> Quand le fichier doit être téléchargé, c'est le nom avec espace qui apparaît. Je voudrais seulement qu'à la place de l'espace il cherche un underscore, car le fichier à downloader contient cet underscore, et il ne le trouve pas puiqu'il cherche un espace à la place. Je ne vois pas ce qui peut bloquer. Si vous pouviez m'aider merci beaucoup
TheRec Posté 17 Juin 2005 Posté 17 Juin 2005 (modifié) Je penche pour dire que ce lien : <A href="download.php?chemin=tatatitatata&file=thumb_<?php echo $row_rs_dev5['DPHO']; ?>"> devrait plutot être : <A href="download.php?chemin=tatatitatata&file=<?php echo $file; ?>"> voir même : <A href="download.php?chemin=<?php echo $chemin; ?>&file=<?php echo $file; ?>"> Mais attention !!! Cela peut permettre à quelqu'un de spécifier un chemin manuellement...donc vérifie bien ce que l'utilisateur envoie comme nom de fichier et chemin, isole un maximum les fifhicer téléchargeables..et si possible utilise des chemin complet (realpath)... (En gros tu essayait de downloader le fichier avec un nom avec des espace, vu qeu tu le dis toi même, tu les stockent avec des underscore, il ne trouve pas... petite erreur, mais c'est quand même important ) Modifié 17 Juin 2005 par TheRec
zazi Posté 17 Juin 2005 Posté 17 Juin 2005 Merci beaucoup TheRec pour ta réponse. Mais le lien ne marche pas avec les corrections que tu apportes, le fichier que ça télécharge est corrompu. Donc je vais garder le lien d'avant qui fonctionne bien. Pour les espaces j'ai trouvé ma réponse, lors de l'insertion du nom du fichier dans la base sql j'ai rajouté ça: $HTTP_POST_FILES['image']['name'] = ereg_replace(" {2,}"," ",$HTTP_POST_FILES['image']['name']);$HTTP_POST_FILES['image']['name'] = str_replace ( " " , "_" , $HTTP_POST_FILES['image']['name'] ); Ca remplace les espaces par des underscores, et enlève les espaces inutiles. Ainsi le nom de la base correspond au nom réel du fichier. Maintenant mon nouveau problème comme tu l'as soulevé c'est la sécurité. Le chemin du fichier s'affiche complètement dans la barre d'état du navigateur quand on passe au dessus du lien et le chemin est ainsi facilement repérable. Maintenant quand je tape l'adresse du fichier dans une nouvelle fenêtre ca marque forbidden. Donc je pense pas que les gens puissent y avoir accès. Je me trompe non? Vous connaissez pas un moyen de cacher le lien que ca marque dans la barre d'état? Merci encore!
TheRec Posté 17 Juin 2005 Posté 17 Juin 2005 (modifié) Avec les données de ton problèmes ce que je t'ai dit marche, le nom du fichier que tu passait par l'URL était le mauvais, enfin celui de la base de données (auparavant avec des espace)... bref tant mieux si tu as trouvé une solution. Pour ton problème de sécurité, j'ai déjà répondu plus haut, pour ce genre de points sensibles, isole les fichiers téléchargeables comme il faut, ne passe que des nom de fichier en ayant un chemin valide, vérifie que l'utilisateur n'essaie pas de passer un chemin relatif dans le nom de fichier ( "../includes/db.php" par exemple ;D ) ... Si l'accès direct au fichier est interdit c'est déjà un bon point... Je vois pas quoi te dire de plus... PS : dans un fichier ".htaccess" se trouvant à la racine de ton répertoire ou se trouvera les fichiers téléchargeables, met cette ligne "Options -Indexes" ça évite déjà l'accès à la liste complète de ton réperoire (pour peu qu'elle ne soit pas déjà désactivé dans le httpd.conf de ton serveur ... ) Modifié 17 Juin 2005 par TheRec
zazi Posté 17 Juin 2005 Posté 17 Juin 2005 Merci beaucoup The Rec! Finallement je me suis trompée ces fichiers sont complètement accessibles en url directe, et c'est le même schéma de fichier donc facilement identifiable. Je me suis penchée sur les .htaccess toute l'après-midi et j'en suis sortie complètement encore plus dans le vague qu'au début. J'ai déjà mis un fichier .htaccess avec la ligne que tu dis mais il me faudrait, si j'ai bien compris de ce que j'ai vu cette aprèm, un fichier htaccess qui redirige toutes les urls qui pointent vers les fichiers commencant par thumb_ , ils ne seraient alors accessibles qu'avec le download.php et c'est là que je comprends plus rien quand je vois la syntaxe de ces fichiers pour ovh... Merci encore pour ton aide
TheRec Posté 17 Juin 2005 Posté 17 Juin 2005 Essaie peut-être de mettre un fichier .htaccess avec ces lignes : Order Deny,AllowDeny from all Dans le réperoire ou les fihcier ne doivent être accessible que par "download.php" (si je puis m'exprimer ainsi...)... Mais si tu affiche ces "thumb_" (je suppose que c'est des miniatures d'images) tu ne pourras plus le faire directement en mettant le chemin direct vers l'image)...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant