Foros del Web » Programando para Internet » PHP »

Uploader seguro

Estas en el tema de Uploader seguro en el foro de PHP en Foros del Web. Quiero desarrollar un sencillo y practico uploader de imagenes, quiero hacerlo lo más seguro posible, he aquí lo que he logrado: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: ...
  #1 (permalink)  
Antiguo 19/09/2011, 12:56
Avatar de BaByRoDrI  
Fecha de Ingreso: julio-2009
Ubicación: Mexico
Mensajes: 60
Antigüedad: 15 años, 4 meses
Puntos: 1
Pregunta Uploader seguro

Quiero desarrollar un sencillo y practico uploader de imagenes, quiero hacerlo lo más seguro posible, he aquí lo que he logrado:

Código PHP:
Ver original
  1. <?php
  2. $dir = "/imagenes"; //recuerda que debe tener permisos de escritura ;)
  3. $ext = array('image/jpeg', 'image/gif', 'image/png', 'image/bmp'); //Puedes agregar más extenciones
  4.     foreach($_FILES as $archivo) {
  5.         $temp  = $archivo['tmp_name'];
  6.         $type = $archivo['type'];
  7.         $name = $archivo['name'];
  8.         $ruta = "$dir/$name";
  9.         if(file_exists($temp)) {
  10.             if(is_uploaded_file($temp)) {
  11.                 if(in_array($type,$ext)) {
  12.                     if($type == 'image/jpeg') {
  13.                         $image = imagecreatefromjpeg($temp);
  14.                         imagejpeg($image, $ruta, 100);
  15.                         echo "<img src='$ruta' />";
  16.                     }
  17.                     else if($type == 'image/png') {
  18.                         $image = imagecreatefrompng($temp);
  19.                         imagepng($image, $ruta, 100);
  20.                         echo "<img src='$ruta' />";
  21.                     }
  22.                     else if($type == 'image/gif') {
  23.                         $image = imagecreatefromgif($temp);
  24.                         imagegif($image, $ruta, 100);
  25.                         echo "<img src='$ruta' />";
  26.                     }
  27.                     else {
  28.                         move_uploaded_file($temp, $ruta);
  29.                         echo "<img src='$ruta' />";
  30.                     }
  31.                 } else {
  32.                     echo "Esto no es una imagen :(";
  33.                 }
  34.             }
  35.         }
  36.     }
  37. ?>

Lamentablemente las imagenes GIF, JPG y PNG no las sube al servidor :(, como la librería GD soporta este tipo de imagenes las quiero re-construir para evitar que me vayan a colar por allí algún codigo raro :3.

No se realmente que esta mal, alguien me puede hechar la mano ?

PD. Según yo alguien pueda spoofear la cabecera y aun así podría saltarse la "seguridad" del script no?

Última edición por BaByRoDrI; 19/09/2011 a las 13:15
  #2 (permalink)  
Antiguo 19/09/2011, 14:00
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Uploader seguro

A ver, supongamos que yo creo un archivo con "codigo malicioso en PHP", lo guardo como imagen.jpg, lo subo a un servidor y trato de abrirlo con el navegador... que pasara?

a) El servidor "piensa" que se trata de una imagen (por la extension) y lo envia directo al navegador, quien no puede interpretar compresion, tipo, tamaño, etc. y muestra un mensaje de error.
b) El servidor tiene una configuracion extraña que hace que los archivos con extensiones .jpg sean interpretados por PHP y ejecuta el codigo malicioso... yo pregunto, quien en su sano juicio configuraria un servidor para comportarse asi?

Bueno, todo esto es solo un resumen para que la cuestion de seguridad no te vuelva paranoico y, hay mejores formas de verificar que el archivo es realmente una imagen.

Regresa al manual de GD y lee acerca de la funcion getimagesize(), aunque los pasos a seguir son:

Código PHP:
Ver original
  1. // Extensiones de imagenes que deseas admitir
  2. $extensiones = array('jpg', 'jpeg', 'gif', 'png');
  3.  
  4. // Extension real del archivo subido
  5. $ext = strtolowr(end(explode('.', $name))); // En minusculas para facilitar las cosas
  6. if( ! in_array($ext, $extensiones)) {
  7.     die("Esto no es una imagen >:-(");
  8. }
  9.  
  10. // La @ es para que no se muestre mensaje de error si:
  11. // - El archivo NO existe
  12. // - El archivo NO es una imagen valida
  13. $imgData = @getimagesize($temp);
  14.  
  15. // Comparacion con triple signo igual (tipo de dato y valor)
  16. if($imgData === false) {
  17.     die("Esto no es una imagen >:-(");
  18. }
  19.  
  20. // Aqui usas move_uploaded_file() o lo que prefieras
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: imagenes, seguro, uploader
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:42.