Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] seguridad para imagenes php

Estas en el tema de seguridad para imagenes php en el foro de PHP en Foros del Web. hola gente, estoy armando un uploader de imagenes (no un hosting, sino para un proyecto) y estoy dando mis primeros pasos en seguridad en este ...
  #1 (permalink)  
Antiguo 01/04/2013, 00:52
Avatar de alex_dh  
Fecha de Ingreso: septiembre-2011
Ubicación: Kreuzberg
Mensajes: 235
Antigüedad: 12 años, 7 meses
Puntos: 14
seguridad para imagenes php

hola gente, estoy armando un uploader de imagenes (no un hosting, sino para un proyecto) y estoy dando mis primeros pasos en seguridad en este area (imagenes y manejo de archivos php)

por el momento tengo hecho algo asi, que segun he leido es seguro (pero no del todo)

Código PHP:
    $tamano $_FILES['img-cuenta']['size'];
    
$tipo $_FILES['img-cuenta']['type'];
    
$nombre $_FILES['img-cuenta']['name'];
    
$tmp $_FILES['img-cuenta']['tmp_name'];
    
    
$imagesize getimagesize($tmp);
    
    
$formatosbuenos = array('jpg''png''jpeg');
    
    if(empty(
$tamano) || empty($tipo) || empty($nombre) || empty($tmp)) {
        require(
'include/header.php');

        require(
'include/ini.cuerpo.php');

        echo 
'<p style="font-size: 20px; text-align: center;">Selecciona una imagen para subir</p>';

        require(
'include/pie.php');
    } elseif(
$imagesize['mime'] == 'image/png' || $imagesize['mime'] == 'image/jpg' || $imagesize['mime'] == 'image/jpeg' || in_array(end(explode('.'$nombre)), $formatosbuenos)) {
        echo 
$nombre;
    } else {
        require(
'include/header.php');

        require(
'include/ini.cuerpo.php');

        echo 
'<p style="font-size: 20px; text-align: center;">Solo se permiten imagenes PNG, JPG y JPEG.</p>';

        require(
'include/pie.php');
    } 
me gustaria que me den su opinion sobre esto y comenten que le agregarian y que le quitarian...

gracias y espero no estorbar
__________________
Avanzado desarrollador HTML, CSS y programador PHP, MYSQL, JAVASCRIPT

=========CALLEJEROS INOCENTES=========
  #2 (permalink)  
Antiguo 01/04/2013, 02:23
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: seguridad para imagenes php

Tu script es seguro, porque estás verificando que sólo se suban imágenes sin confiar en el 'type' enviado por el navegador.

Sólo te faltarían algunos detalles:

1- Revisar $_FILES['img-cuenta']['error'] antes de cualquier otra cosa. Si es 4, el usuario no seleccionó un archivo; si es cero, el archivo subió correctamente; si es otro valor, hubo error al subir/guardar el archivo.

2- Verificar que la extensión y el tipo mime correspondan. De hecho, esto no agrega seguridad, pero es conveniente.

3- No muestras si mueves/copias el archivo a su carpeta final, en todo caso, asegúrate de que se guardó correctamente con file_exists('ruta/y/nombre_de_archivo')
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 01/04/2013, 11:24
Avatar de alex_dh  
Fecha de Ingreso: septiembre-2011
Ubicación: Kreuzberg
Mensajes: 235
Antigüedad: 12 años, 7 meses
Puntos: 14
Respuesta: seguridad para imagenes php

Cita:
Iniciado por Triby Ver Mensaje
Tu script es seguro, porque estás verificando que sólo se suban imágenes sin confiar en el 'type' enviado por el navegador.

Sólo te faltarían algunos detalles:

1- Revisar $_FILES['img-cuenta']['error'] antes de cualquier otra cosa. Si es 4, el usuario no seleccionó un archivo; si es cero, el archivo subió correctamente; si es otro valor, hubo error al subir/guardar el archivo.

2- Verificar que la extensión y el tipo mime correspondan. De hecho, esto no agrega seguridad, pero es conveniente.

3- No muestras si mueves/copias el archivo a su carpeta final, en todo caso, asegúrate de que se guardó correctamente con file_exists('ruta/y/nombre_de_archivo')
estoy viendo lo de los errores...

lo del mime podria hacer algo como

Código PHP:
$imagesize['mime'] == $_FILES['img-cuenta']['type'
eso estaria bien?
__________________
Avanzado desarrollador HTML, CSS y programador PHP, MYSQL, JAVASCRIPT

=========CALLEJEROS INOCENTES=========
  #4 (permalink)  
Antiguo 01/04/2013, 14:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: seguridad para imagenes php

Noooo.... no confíes en el type que viene con $_FILES, ese es proporcionado por el navegador y, por tanto, poco confiable.

Si el tipo mime que obtienes con getimagesize() es image/jpg, entonces el nombre del archivo debe tener extensión .jpg
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 01/04/2013, 14:41
Avatar de alex_dh  
Fecha de Ingreso: septiembre-2011
Ubicación: Kreuzberg
Mensajes: 235
Antigüedad: 12 años, 7 meses
Puntos: 14
Respuesta: seguridad para imagenes php

Cita:
Iniciado por Triby Ver Mensaje
Noooo.... no confíes en el type que viene con $_FILES, ese es proporcionado por el navegador y, por tanto, poco confiable.

Si el tipo mime que obtienes con getimagesize() es image/jpg, entonces el nombre del archivo debe tener extensión .jpg
no se como tomar la extension del archivo

me ayudas?
__________________
Avanzado desarrollador HTML, CSS y programador PHP, MYSQL, JAVASCRIPT

=========CALLEJEROS INOCENTES=========
  #6 (permalink)  
Antiguo 01/04/2013, 15:37
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: seguridad para imagenes php

Lee esto: http://www.forosdelweb.com/f18/aport...8/#post4265376
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 01/04/2013, 22:56
Avatar de alex_dh  
Fecha de Ingreso: septiembre-2011
Ubicación: Kreuzberg
Mensajes: 235
Antigüedad: 12 años, 7 meses
Puntos: 14
Respuesta: seguridad para imagenes php

Cita:
ahi lei lo de las imagenes, y hice una comprobacion tambien con el getimagesize()

me quedó algo asi:

Código PHP:
if($imagesize['mime'] == 'image/png' || $imagesize['mime'] == 'image/jpg' || $imagesize['mime'] == 'image/jpeg' && in_array(end(explode('.'$nombre)), $formatosbuenos) && filesize($tmp) < '1000000' && $error == '0' && $imagesize !== false) {
            if (
is_uploaded_file($_FILES['img-cuenta']['tmp_name'])) {
                 
copy($tmp$directorio);
                 
$sql_cambiaimagen mysql_query("UPDATE sis_usuario SET imgperfil='$nuevaurl' WHERE iduser='$id_user'");
                 
header('location:cuenta.php?nu=1');
            } else {
                
header('location:cuenta.php?eu=1');
            } 
estará bien ahi?
__________________
Avanzado desarrollador HTML, CSS y programador PHP, MYSQL, JAVASCRIPT

=========CALLEJEROS INOCENTES=========
  #8 (permalink)  
Antiguo 02/04/2013, 12:33
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: seguridad para imagenes php

Lo veo bien, sólo recuerda que algunas cámaras/software generan los archivos con extensiones en mayúsculas, por eso es recomendable usar strtolower para obtener y comparar la extensión.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 02/04/2013, 13:31
Avatar de alex_dh  
Fecha de Ingreso: septiembre-2011
Ubicación: Kreuzberg
Mensajes: 235
Antigüedad: 12 años, 7 meses
Puntos: 14
Respuesta: seguridad para imagenes php

Cita:
Iniciado por Triby Ver Mensaje
Lo veo bien, sólo recuerda que algunas cámaras/software generan los archivos con extensiones en mayúsculas, por eso es recomendable usar strtolower para obtener y comparar la extensión.
claro, estaba pensando en eso, muchas gracias por todo
__________________
Avanzado desarrollador HTML, CSS y programador PHP, MYSQL, JAVASCRIPT

=========CALLEJEROS INOCENTES=========

Etiquetas: imagenes, seguridad
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:28.