2012-03-10 2 views
0

J'ai un problème avec les certificats de signature invalides sur les fichiers téléchargés avec Firefox. IE, Opera, Safari et Chrome vont bien. Si le fichier est téléchargé directement en cliquant sur un lien dans FF c'est ok mais si le fichier est téléchargé avec PHP pour plus de sécurité c'est 1 octet plus grand, avec un x0A à la fin et je pense que ça fait échouer le contrôle de validation . Le PHP est très simple:Le fichier téléchargé en PHP avec Firefox est erroné. Taille

<?php 
$file = "../downloads/".$_GET['link']; 
$size = filesize($file); 
$type = filetype($file); 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-Disposition: attachment; filename=".basename($file)); 
header("Content-Length: ".$size); 
header("Content-Type: ".$type); 
readfile($file); 
?> 

Est-ce que quelqu'un a une idée pourquoi seul Firefox devrait avoir des problèmes avec obtenir la taille ici? Reconnaissant pour toutes les idées.

+1

Veuillez lire ceci: http://stackoverflow.com/questions/2882472/php-send-file-to-user – rkosegi

+4

Que faire si j'utilise '? Link = ../../../includes/db_connection_info. php'? – alex

+0

Je sais que cela ne fait pas partie de votre question, mais vous devriez vraiment assainir $ _GET ['link'], sinon ce script permettra à n'importe qui de télécharger n'importe quel fichier sur votre système de fichiers auquel le serveur web peut accéder. (Aussi les fichiers de configuration php, etc.) – Arend

Répondre

0

remplacer la ligne ci-dessous

<?php 
header("Content-Length: ".strlen($file)); 
?> 

bonne chance :)

+0

'$ file' contient le * chemin * du fichier, pas le contenu du fichier lui-même. –

+0

Ta pour tous les autres commentaires, les sites web ne sont pas vraiment mon domaine d'expertise, je suis strictement un marchand de pâte et de pâte, donc je vais regarder toutes les suggestions. Les commentaires de Re Alex sur la sécurité ne devraient pas empêcher les permissions de fichier – user1164035

4
  1. Vérifiez si le fichier existe et est placé dans un endroit autorisé - maintenant attaquant est en mesure de télécharger presque tous les fichiers sur votre serveur web
  2. Ne pas utiliser la fermeture phptag - ?>, chaque espace après il sera envoyé au navigateur
  3. Utilisez exit; juste après readfile pour s'assurer qu'aucune autre fonction produisant une sortie n'est appelée.
+0

Brilliant! Il y avait quelques lignes après le?>, Comme vous l'avez suggéré et ça marche. Merci beaucoup. – user1164035

1

contrôle sur l'en-tête Content-Type, vous définissez deux fois si celle-ci sera utilisée, il pourrait être quelque chose comme « Content-Type: fichier » en raison, le navigateur à la fonction filetype() ne peut pas comprendre le type de contenu "fichier" et le prendre sous forme de fichier texte. Je suppose que c'est la cause de l'0x0a supplémentaire.
Commenter "header (" Content-Type: ". $ Type);" et ça marchera bien.

Questions connexes