Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created February 5, 2019 18:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/68d7230ed64be2fcfe3d774c1e911bba to your computer and use it in GitHub Desktop.
Save parzibyte/68d7230ed64be2fcfe3d774c1e911bba to your computer and use it in GitHub Desktop.
<?php
/**
* Forzar la descarga de un archivo con
* PHP a partir del parámetro GET. Ejemplo 2
*
* @author parzibyte
*/
/*
-------------------------------------
- Grandiosa nota sobre la seguridad -
-------------------------------------
Este script es ilustrativo, puedes usarlo
en producción pero asegúrate de limitar
los archivos que se pueden leer. Por ejemplo,
haz un arreglo de los permitidos y luego usa
in_array, o comprueba antes qué fichero vas
a servir
Este script puede servir literalmente cualquier archivo
a través del dato que haya en $_GET["a"]. Si quieres puedes
quitar eso y tomar el nombre desde otro lugar (p. ej. la sesión
o una base de datos en la que confíes)
Un atacante podría ver todos los archivos, incluyendo el index.php
u otros que estén arriba o abajo (usando ../ o /) y podría llegar
incluso a la raíz del sistema
En resumen, lee los archivos a partir de un nombre en el que confíes
*/
if (empty($_GET["a"])) {
exit("No proporcionaste ningún nombre de archivo");
}
$archivo = $_GET["a"];
if (!file_exists($archivo)) {
exit("Archivo no existente");
}
$nombre = basename($archivo);
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=$nombre");
readfile($nombre);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment