-
-
Save parzibyte/68d7230ed64be2fcfe3d774c1e911bba to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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