Upload de imagenes seguro PHP

Iniciado por RicRed, 13 Mayo 2012, 22:13 PM

0 Miembros y 1 Visitante están viendo este tema.

RicRed

Hola a la gente del foro, estoy tratando de hacer un upload de imagenes seguro en PHP, en la cual los usuarios puedan subir imagenes en una carpeta y publicarlas en el foro.

Tengo el siguiente codigo:

Código (php) [Seleccionar]
       <form action="" method="post" enctype="multipart/form-data">
          <p>
          <input type="file" name="imagen">
          <input type="submit" name="submit" value="Subir" /></p>
       </form>
       <?php
        
if(isset($_FILES['imagen'])){
        
//configuracion
           
$permitidas = array('jpg','jpeg','png','gif'); //extensiones permitidas
           
$size=2097152//tamano maximo en bytes
           
$url="http://localhost/otros/upload/"//con / al final
           
$carpeta="images/"//carpeta de las imagenes
          
           
$errores = array();
           
$nombre trim($_FILES['imagen']['name']);
           
$ext strtolower(end(explode('.',$nombre)));
           
$tamano $_FILES['imagen']['size'];
           
$tmp $_FILES['imagen']['tmp_name'];
           
$urlimagen=$carpeta.rand().$nombre;
         
           if(
in_array($ext,$permitidas) === false){
              
$errores[] = 'Extension no permitida';
           }
           if(
$tamano>$size){
              
$errores[] = 'El tamaño del archivo debe ser menor a 2mb';
           }
           if(empty(
$errores)){
              if(
move_uploaded_file($tmp,$urlimagen)){
                 
?>

                <h3>html</h3>
                <input type="text" value="<img src='<?php echo $url.$urlimagen ?>'>" /><br />
                <h3>BBcode</h3>
                <input type="text" value="[img]<?php echo $url.$urlimagen ?>[/img]" /><br />
                <h3>Enlace directo</h3>
                <input type="text" value="<?php echo $url.$urlimagen ?>" /><br />
                <?php
              
}
           }else{
              foreach(
$errores as $error){
                 echo 
$error."<br />";
              }
           }
        }
        
?>


Sube archivos con extensiones de imagenes, al subir un php da un error

Extension no permitida

Hay bien, pero pueden burlar el sistema y subir una imagen con codigo php ejemplo, subo una imagen con codigo php y luego edito por post jpg por php y subiria un archivo php?

Espero me ayuden.

Saludos! y disculpen la pregunta.

Shout

Hombre, pueden subir una imágen (válida) con código PHP en los comentarios, aunque si has verificado que en tu web no hay LFI, no hay problema ;)

Igual pasala por GD, así se eliminan los comentarios y, también aplicale algo como getimagesize() o similares, si tiran error es que no es una imágen válida, así cancelas el upload y listo.

PD: Filtra también que el nombre no contenga el byte nulo porque, si lo contiene, no estoy seguro pero puede que logren bypassear tu filtro.




Explicación sobre el byte nulo:
Imaginate que tienes esto en PHP:
Código (php) [Seleccionar]
<? if(file_exists('include/'.$_GET['include'].'.php')) include('include/'.$_GET['include'].'.php'); ?>

Y yo voy a:
file.php?include=../files/avatares/mi_avatar_con_comentario_malicioso.jpg%00

Se incluiría perfectamente el archivo, pues el %00 es el byte nulo, que indica el final del string, por lo que el resto es ignorado y el include queda como include/../files/avatares/mi_avatar_con_comentario_malicioso.jpg, y, al tener los tags PHP <? ?> (la imagen en los comentarios), la función include los evalúa y ejecúta el código, por lo que el atacante tendría el poder de ejecutar código PHP en tu servidor (más que suficiente para hackearte por completo).

Nota: no es necesario que el archivo sea .php para que include() ejecute el código que hay en él (entre los tags <? ?>).

Espero que me hayas entendido.

Saludos.
I'll bring you death and pestilence, I'll bring you down on my own

WarGhost

Lo mejor que puedes hacer es pasarla por GD, así evitar la inyección de código .

También puedes ver esto:
http://es.php.net/manual/es/security.hiding.php

Lo mejor es tener un código libre de errores, pero cada eslabón de seguridad adicional ayudan.


Un saludo!
¿Qué culpa tengo yo de tener la sangre roja y el corazón a la izquierda?