> Manuales > Taller de PHP

Cómo proteger archivos para descarga en aplicaciones PHP, para que no puedan ser descargados sin permiso.

Las descargas de archivos son una excelente herramienta para conseguir diversos beneficios de los visitantes que acceden a nuestra web. Nosotros las utilizamos de manera bastante intensiva, desde hace años en DesarrolloWeb.com y nos sirven para conseguir cosas como registros de personas como usuarios o donaciones.

Además, las descargas se pueden utilizar obtener ingresos por su venta, o muchas otras cosas que podamos imaginar. En este artículo no pretendemos hablaros sobre cómo rentabilizar las descargas, sino presentar una posible manera de proteger los archivos, para que sólo los descarguen aquellos usuarios que tengan permiso para ello.

Si tenemos la duda de cómo proteger esas descargas que hemos creado, por ejemplo, para usuarios registrados, o bien para usuarios que han realizado un pago, etc. en este artículo vamos a ver cómo podíamos implementar un sencillo pero práctico nivel de seguridad.

Situación de los archivos

El primero de los consejos para proteger nuestros archivos importantes es colocarlos fuera de la carpeta de publicación del dominio. Esto tiene una fácil explicación. La carpeta de publicación es la que se puede acceder a través de un navegador, componiendo una URL que dependa de nuestro dominio. Todo lo que metamos en esa carpeta podría ser accedido desde un navegador. Podríamos proteger un determinado directorio con herramientas como el .htaccess, pero la verdad es que no es necesario si simplemente sacamos la carpeta donde están las descargas del directorio de publicación.

Por decirlo de otra manera, los usuario solo pueden ver los archivos que se encuentran colgando de la carpeta de publicación, por lo que si colocamos fuera la carpeta donde están las descargas, será imposible acceder a ella y por tanto hacer una utilización no permitida de la misma.

Código de descargas

Este segundo consejo es simplemente realizar un buen código para la descarga de dichos archivos protegidos. Para ello podemos aplicar el siguiente código:

$filename = "ruta-archivo" . $archivo;
   header("Expires: -1");
   header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
   header("Content-type: application/zip;\n"); //or yours?
   header("Content-Transfer-Encoding: binary");
   header("Cache-Control: no-store, no-cache, must-revalidate");
   header("Cache-Control: post-check=0, pre-check=0");
   header("Pragma: no-cache");
   $len = filesize($filename);
   //header("Content-Length: $len;\n");
   $outname=$archivo;
   header("Content-Disposition: attachment; filename=".$outname.";\n\n");
   readfile($filename);

El código, que lo podemos encontrar en varias referencias para desarrolladores, como la propia documentación de PHP, es bien sencillo. Lo único que tenemos que tener en cuenta es, en la primera línea, cuando se define la variable $filename, es indicar la ruta correcta hacia el archivo en nuestro servidor y el nombre del mismo, que deberíamos tener en una variable $archivo.

Nota: Es importante tener en cuenta que los archivos que vamos a descargas estén comprimidos y terminen en .zip, si no fuera así tendríamos que cambiar los parámetros pasado en el header Content-type.

Con este código y un script previo que compruebe por ejemplo si el usuario esta registrado, o si ha pagado, tendríamos una buena protección para dichos archivos y no tendríamos que preocuparnos de posibles descargas no permitidas.

Nota: Puedes ver el manual “Sistema de autentificación PHP” si necesita ayuda para comprobar la situación del usuario que quiere descargar el archivo.

Conclusión

Este código, junto con un buen script que compruebe si el usuario esta registrado y si puede acceder a dicha descarga, podemos tener un buen sistema de descargas en PHP para nuestra página web. Lo mejor de todo, como se habrá podido comprobar, es su sencillez, al alcance de cualquier desarrollador, por poca experiencia que tenga.

Sara Alvarez

Equipo DesarrolloWeb.com

Manual