Buscador


En todo Internet
En Uterra.Com

Contenidos


Una pregunta que más de una vez nos hemos planteado es como conseguir descargar archivos de manera segura cuando tenemos un sistema de autenticación con PHP. Más concretamente, con un sistema de autenticación como este solo podemos limitar el acceso a documentos con la extensión .php, por tanto un documento .zip, por ejemplo, no podría protegerlo. Más de uno diréis, pero si la ruta a ese archivo está dentro de una página Web protegida con PHP, no hay manera de poder acceder a el, y sí, es cierto, a menos que acierte por azar. Pero también es posible que un usuario identificado vea la ruta, y la publique por ejemplo en un foro. Con lo que si la ruta esta en un foro, ese archivo ya es accesible para todo el que vea el enlace y no tendremos ningún control sobre las descargas.

Pues bien, planteado en problema en su justa dimensión, necesitamos un script que contenga la dirección, y sin desvelarla, fuerce la descarga del archivo. De esta manera el usuario nunca podrá saber en que directorio se encuentra.

En nuestro caso, la carpeta en la que guardo los archivos, y que no quiero que se conozca se llama “carpeta_x” (obviamente lo digo por motivos didácticos, no tiene sentido decir el nombre de la carpeta que quieres ocultar), y el archivo se llamará “archivo.zip”. Lógicamente el nombre del archivo si lo conocerá el usuario una vez lo descargue. La cuestión es que, no se pueda saber el nombre de la carpeta o directorio que lo contiene de cara ha hacer la descarga. Sobre como limitar el acceso a este archivo a usuarios identificados es otro tema que lo veremos en un artículo destinado a ello.

Así, todo lo que tenemos que hacer para iniciar la descarga es enlazar el siguiente archivo, llamado "oculta_ruta.php":

<?php 
// Permite la descarga de un archivo ocultando su ruta 

$nombre "archivo.zip"
$filename "carpeta_x/archivo.zip"
$size filesize($filename); 
header("Content-Transfer-Encoding: binary"); 
header("Content-type: application/force-download"); 
header("Content-Disposition: attachment; filename=$nombre"); 
header("Content-Length: $size"); 
readfile("$filename"); 
?>  

Código PHP