Vous êtes sur la page 1sur 2

Forzar descargas con PHP (Cristalab)

1 de 2

http://www.cristalab.com/tutoriales/forzar-descargas-con-php-c166l/

Artculos

Foros

Tutoriales

Tips

Cursos

Tags

Buscar

Ejemplos Comics Anime FAQ Colaborar Registrate

Ests en: Cristalab > Tutoriales > Forzar descargas con PHP

Forzar descargas con PHP


Por: fael

4 de Abril del 2006

Lenguajes de servidor

2601 de clabLevel
Otros artculos de fael

51,633 visitas

php

Hacer descargables cualquier tipo de archivos no es muy complicado. La mayora de las tecnologas del lado del servidor nos permiten
hacer esto, en este caso veremos cmo es con PHP.
El script fue sacado del todopoderoso php.net y es el siguiente:
<?php
$f = $_GET["f"];
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen("$f", "r");
fpassthru($fp);
?>
De esta forma, cuando necesitemos que el explorador quiera descargar, por ejemplo un archivo de imagen, lo llamaramos
descargar.php?f=imagen.jpg.
Y el navegador abrir el dilogo de descarga:

Sencillo, no? Bien, pero podra haber serios problemas, dejar el script as podra hacer descargable cualquier tipo de archivo, incluyendo
el cdigo fuente de otros archivos php.
A continuacin veremos cmo implementar algunas medidas de seguridad.

Haciendo el script ms seguro


Aqu podemos tener dos opciones, enlistar los tipos de archivos que pueden ser descargables o listar las extensiones de los archivos que

20/05/2009 09:55 a.m.

Forzar descargas con PHP (Cristalab)

2 de 2

http://www.cristalab.com/tutoriales/forzar-descargas-con-php-c166l/

podemos descargar.
Adems, para evitar que se pueda navegar en otros directorios, vamos a implementar una comprobacin.
Listando los archivos descargables.
til cuando son relativamente pocos los archivos descargables, los nombres los metemos en un arreglo y hacemos una sencilla
comprobacin y listo.
<?php
$archivos = array("imagen.jpg", "logo.png", "flash.swf");
$f = $_GET["f"];
if(strpos($f,"/")!==false){
die("No puedes navegar por otros directorios");
}
if(!in_array($f,$archivos)){
die("<b>ERROR!</b> no es posible descargar $f");
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen("$f", "r");
fpassthru($fp);
?>
De esta forma, si queremos descargar un archivo que no sean los que enlistamos en el arreglo, nos aparecer el mensaje de error:
ERROR! no es posible descargar archivo.ext
Adems este script es sensitivo a maysculas y minsculas, no es lo mismo flash.swf que Flash.swf, fLaSh.SwF... etc
Pero qu pasa cuando tenemos 100 imagenes en formato jpg, png y gif que querramos que el usuario pueda descagar? Para eso usamos un
filtrado de extensin.
Listando las extensiones de los archivos que puedan ser descargables
La lgica es igual, usar in_array para saber si el archivo a descargar tiene una de las extensiones que hemos marcado como descargables,
esto se hace con explode y count, seguramente habr una forma ms eficiente de hacerlo pero no la conozco.
<?php
$extensiones = array("jpg", "jpeg", "png", "gif");
$f = $_GET["f"];
if(strpos($f,"/")!==false){
die("No puedes navegar por otros directorios");
}
$ftmp = explode(".",$f);
$fExt = strtolower($ftmp[count($ftmp)-1]);
if(!in_array($fExt,$extensiones)){
die("<b>ERROR!</b> no es posible descargar archivos con la extensin $fExt");
}
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen("$f", "r");
fpassthru($fp);
?>
Y con esto la descarga de archivos se hace ms fcil y ms segura. Espero les haya servido.

Informacin adicional
Si tienes alguna pregunta de este tutorial; puedes hacerla aqui en los foros

Cristalab | Artculos | Foros | Comics | Tutoriales | Tutoriales de Flash | Ejemplos | Anime | Tips | FAQ | Colaborar

20/05/2009 09:55 a.m.

Vous aimerez peut-être aussi