Descargas seguras mediante PHP
Interesante script que te ayudará si no quieres que la gente acceda directamente a tus ficheros para bajárselos. Para ello lo que hará será recoger un parámetro con el fichero que se quiere bajar, añadirle el path donde se encuentra y mediante la cabecera de la respuesta (header) devolver el fichero.
<?
$dir="/path/directorio/";
if (isset($_REQUEST["fichero"])) {
$fichero=$dir.$_REQUEST["fichero"];
header("Content-type: application/force-download");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize($fichero));
header("Content-disposition: attachment; filename=\"".basename($fichero)."\"");
readfile("$fichero");
} else {
echo "Fichero seleccionado";
}
?>
Si avanzáis en el artículo, veréis un caso más práctico con la base de datos.
Vía / Good PHP Tutorials
Relacionados
Feedback off | Del.icio.us
1. Yezz ~ Martes, 03 Oct 2006 | 03:35H:
Este tipo de código suele tener puñaladas traperas inesperadas. En este caso, lo que se podría considerar una jaula segura ($dir), se transforma en un puerta abierta a todo el árbol de directorios, escalado directorios, así:
$_REQUEST["fichero"] = '../a-salvo.txt';
Lo que provoca la descarga de: /path/a-salvo.txt
En estos casos, me gusta más la idea del "censo". Una lista de nombres con valores, bastaría con un switch para algo simple:
switch($_REQUEST["fichero"]){
case 'foo.txt':
$fichero = '/texto/foo.txt';
break;
case 'bar.php':
$fichero = '/script/bar.php';
break;
case 'quux.png':
$fichero = '/imagen/quux.png';
break;
default:
die('no existe');
}
2. Luis ~ Martes, 03 Oct 2006 | 08:33H:
Alidhaey, la verdad es que si es raro, raro, raro. Supongo que el que escribe el comentario estaría cortándose las venas.
Yezz, tienes toda la razón del mundo. En el artículo que enlazo, en la "página" dos hace algo parecido con la base de datos.
Gracias a ambos por vuestras aportaciones.
3. Luis ~ Martes, 03 Oct 2006 | 23:16H:
La verdad es que echo en falta File.separator de Java en PHP, aunque reemplazando siempre '\' por '/' podemos obtener el mismo resultado. Pero cierto, hay que tener mucho cuidado con las barras.
Pues ya sabes, alidhaey, cuando acabes de investigar sobre el DOM, nos regalas un script anti-robots roba fotos :D, estaría bastante bien.
Saludos
4. Yezz ~ Miércoles, 04 Oct 2006 | 17:36H:
#5 Luis,
No uso Java y quizá meta la pata, pero por lo que veo File.separator, en PHP puede sustituirse por la constante DIRECTORY_SEPARATOR.
Que quieres decir con "...hay que tener mucho cuidado con las barras"?
5. Luis ~ Miércoles, 04 Oct 2006 | 21:21H:
Hola Yezz.
Pues mira, esa constante no me la conocía, y mira que estuve buscando una vez un rato largo :(
Pues que a veces tienes unos problemas gordos cuando pones rutas absolutas tipo "C:\directorio\loquesea" y luego quieres compararlo con una ruta que obtienes mediante un método de PHP y puede que obtengamos algo así "C:/directorio/loquesea", por lo que aunque realmente representan el mismo directorio, son cadenas de texto diferentes.
Gracias por la constante, apuntada.
6. Luis ~ Miércoles, 04 Oct 2006 | 22:53H:
¡Ops!, lo siento, te entendí mal, jeje. Pues nada, dale, me lo tienes para el lunes, jeje.
Lo del DOM te ha quedado bastante bien, nada, que dentro de poco serás la máquina de DOM, que no del Doom.
Mírame a mí, al principio odiaba el Java y llevo ya unos cuantos años trabajando con ello. Ahora no solo odio el Java, sino el PHP, el HTML, :P

