2017-09-06 2 views
1

J'utilise un script de téléchargement de force PHP comme suit: -Pourquoi le script PHP Force Download ne fonctionne pas si j'inclure un espace (% 20) dans l'URL?

$file_Name = $_GET['name']; 
$file_Url = $_GET['file']; 
header("Cache-Control: public"); 
header("Content-Description:  File Transfer"); 
header("Content-Disposition: attachment; filename=$file_Name"); 
header("Content-Type: application/octet-stream"); 
header("Content-Transfer-Encoding: binary"); 
readfile($file_Url); 
exit; 

Si l'URL de mon lien est comme: -/image.php?name=Germany.png & file = https% 3A% 2F% 2Fmaps.google.com% 2Fmaps% 2Fapi% 2Fstaticmap% 3Fcenter% 3D Allemagne% 26zoom% 3D15% 26size% 3D240x320% 26maptype% 3Droadmap% 26mobile% 3Dtrue% 26sensor% 3Dfalse, donc cela fonctionne sans aucun problème! Et si j'inclus un espace (% 20) à l'intérieur de l'URL et que j'essaie de le visiter, les navigateurs me montrent "Échec du téléchargement"!

Exemple URL: -/image.php?name=Image.png & file = https% 3A% 2F% 2Fmaps.google.com% 2Fmaps% 2Fapi% 2Fstaticmap% 3Fcenter% 3D River % 20Annan % 26zoom% 3D15% 26size% 3D240x320% 26maptype% 3Droadmap% 26mobile% 3Dtrue% 26sensor% 3Dfalse

Alors, pourquoi cela se produit-il? Qu'est-ce qui ne va pas avec ça?

+1

Bien que la question réelle posée de savoir pourquoi est un mystère pour moi atm, je voudrais souligner que ce script est très dangereux. Si quelqu'un tapait "config.php" dans le fichier et que vous aviez votre fichier de configuration comme ça. Il afficherait toutes vos informations confidentielles. Vous devriez filtrer votre entrée avant de l'utiliser. 'filter_input (INPUT_GET, 'file', FILTER_VALIDATE_URL)' – Grumpy

Répondre

1

remplacer l'espace avec - puis essayez de lire url

$file_Name = $_GET['name']; 
$file_Url = $_GET['file']; 
header("Cache-Control: public"); 
header("Content-Description:  File Transfer"); 
header("Content-Disposition: attachment; filename=$file_Name"); 
header("Content-Type: application/octet-stream"); 
header("Content-Transfer-Encoding: binary"); 
echo readfile(str_replace(" ","-",$file_Url)); 
exit; 
+0

'exit' est-il inutile? Vous ne l'avez pas inclus! –

+0

Oui, donc le contenu n'obtient pas de données supplémentaires après la lecture du fichier –

+0

J'ai utilisé 'echo readfile (str_replace (" ","% 20 ", $ file_Url)); exit; 'à la place! Mais les deux œuvres! –

1

Cela arrive, car en conséquence à php docs, "Les superglobales $ _GET et $ _REQUEST sont déjà décodées.", Donc% 20 est remplacé par l'espace . Le code suivant devrait fonctionner:

readfile(urlencode($file_Url)); 

+1 pour unsafety générale du code

+0

ceci encodera également '/' et d'autres contenus qui seront nécessaires. essayez votre solution avec l'exemple OP. Il se terminera avec l'erreur –

+0

Ok, donc plus de travail est nécessaire, d'abord diviser le chemin par "/", puis tout encoder sauf domaine et se joindre à nouveau –