[PhP] Forcer le download.
Résolupostgresophil -
Je voulais savoir comment on fait en PhP pour forcer l'utilisateur à télécharger un document (mon cas un PDF).
Que lorsque l'on clic sur le lien, on ait l'invite de télécharegement qui s'affiche.
Je sais que c'est avec des hearders mais je ne me souviens plus bien...
Merci à vous !
--
Zep3k!GnO
On est des rangers mec, des rangers...
23 réponses
- 1
- 2
Le téléchargement forcé d'un fichier via PHP et l'invite de téléchargement affichée par les en-têtes HTTP constituent le problème central et suscitent des débats sur les bonnes pratiques. Plusieurs réponses décrivent des scripts utilisant readfile et basename pour limiter l'accès et éviter le traversal, mais soulignent qu'un tel code présente des risques de sécurité importants. D'autres préconisent des approches alternatives comme Content-Type application/octet-stream et Content-Disposition, des solutions basées sur .htaccess ou des mécanismes tokenisés, tout en avertissant des limites selon le serveur et le navigateur. En dernier, la discussion rappelle qu'il faut sécuriser le mécanisme avec validation des entrées, restriction des fichiers et tests sur divers serveurs afin d'éviter les compromises tout en garantissant la compatibilité.
-
Le script mentionné ci-dessus est TRÈS INSÉCURE
Si par exemple on se trouve sur un serveur linux, il suffit de lui passer, par exemple,la valeur "../../../../../../etc/passwd" pour downloader le fichier /etc/passwd... On peut virtuellement accéder à n'importe lequel fichier du serveur à l'aide de ce script.
Utiliser plutot ce script, qui utilise basename() afin de se limiter aux fichiers du répertoire local, par exemple.
<?php
$file=$_GET['file'];
if (($file != "") && (file_exists("./" . basename($file))))
{
$size = filesize("./" . basename($file));
header("Content-Type: application/force-download; name=\"" . basename($file) . "\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $size");
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("./" . basename($file));
exit();
}
?>
- 1
- 2