Cómo proteger archivos para descarga en aplicaciones PHP, para que no puedan ser descargados sin permiso.
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.
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.