Foros del Web » Programando para Internet » PHP »

Que problemas de seguridad puedo tener al dejar subir imagenes

Estas en el tema de Que problemas de seguridad puedo tener al dejar subir imagenes en el foro de PHP en Foros del Web. tengo el siguiente codigo el cual uso para subir imagenes, especificamente fotos de alumnos, que puedan subir ellos mismos, le coloque el criterio que solo ...
  #1 (permalink)  
Antiguo 12/07/2010, 07:45
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Que problemas de seguridad puedo tener al dejar subir imagenes

tengo el siguiente codigo el cual uso para subir imagenes, especificamente fotos de alumnos, que puedan subir ellos mismos, le coloque el criterio que solo puedan subir archivo de extension .jpg y un tamaño maximo de 100 kb.

pero viendo el codigo me pregunte si una persona mal intencionada viene y agarra algun virus, exploit o cualquier otro y le coloca de extension .jpg, podria tener problemas, ya que dejaria subir el archivo igual y podria ejecutarse de alguna manera dentro del servidor.

si alguien tiene alguna idea para darle mañor seguridad le agradezco la respuesta

Código PHP:
<?
session_start
();

$cedula$_SESSION["cedula"];

//datos del arhivo
$nombre_archivo $HTTP_POST_FILES['userfile']['name'];
$tipo_archivo $HTTP_POST_FILES['userfile']['type'];
$tamano_archivo $HTTP_POST_FILES['userfile']['size'];
//compruebo si las características del archivo son las que deseo
if (!((strpos($tipo_archivo"jpeg")) && ($tamano_archivo 100000))) {

    if(
$_SESSION["autorizacion"]=="si")

{
           
            
             
?>
             
         <script type='text/javascript' language='javascript'>
         alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo') 
         document.location.href='alumnos/infoalum.php'    
         </script> 
         
         <?
         
}
         else
         {
         
?>
          
          <script type='text/javascript' language='javascript'>
         alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo') 
         document.location.href='profesor/infoprofe.php'    
         </script> 
          <? 
          
}
    
    
}else{
    if (
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], "fotos/".$nombre_archivo) && rename("fotos/".$nombre_archivo,"fotos/".$cedula.".jpg")){
            
    if(
$_SESSION["autorizacion"]=="si")

{
           
            
             
?>
             
         <script type='text/javascript' language='javascript'>
         alert('SU IMAGEN FUE SUBIDA DE FORMA EXITOSA') 
         document.location.href='alumnos/infoalum.php'    
         </script> 
         
         <?
         
}
         else
         {
         
?>
          
          <script type='text/javascript' language='javascript'>
         alert('SU IMAGEN FUE SUBIDA DE FORMA EXITOSA') 
         document.location.href='profesor/infoprofe.php'    
         </script> 
          <? 
          
}
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }
}
?>
  #2 (permalink)  
Antiguo 12/07/2010, 08:51
Avatar de urgido  
Fecha de Ingreso: febrero-2005
Mensajes: 2.351
Antigüedad: 14 años, 9 meses
Puntos: 25
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

lo mejor es que uses cabeceras mime types para validar el archivo y de esta forma cersiorarte que no sea un .exe renombrado en .jpg.

Saludos
__________________
Hospedaje Web al mejor costo!
  #3 (permalink)  
Antiguo 12/07/2010, 12:06
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

y me podrias decir como usarlas, ya que es primera vez que escucho hablar de esas cabeceras
  #4 (permalink)  
Antiguo 12/07/2010, 12:25
rpv
 
Fecha de Ingreso: febrero-2010
Mensajes: 275
Antigüedad: 9 años, 10 meses
Puntos: 10
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

Dos puntos:

1. $HTTP_POST_FILES está obsoleta, ahora se usa $_FILES.
2. Lo que te comentan anteriormente lo puedes ver con $_FILES['userfile']['type'], el tipo de las imágenes JPG es image/jpg o image/jpeg.

Respecto a la seguridad, hay un bug explotable si haces includes tomando variables desde la url, si haces cosas como dominio.com/ver.php?seccion=portada.php donde tu código es:

include($_GET['seccion']);

se puede inyectar código PHP en la descripción de las imágenes (dentro de la imagen) para que se explote de la forma:

dominio.com/ver.php?seccion=el/path/a/la/imagen/subida.jpg

para que cargue la imagen como si fuera archivo PHP y por consiguiente explotando el código.
  #5 (permalink)  
Antiguo 12/07/2010, 12:45
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

ok con respecto a lo primero que dices solo debo cambiar el $HTTP_POST_FILES por $_FILES

con respecto a lo segundo ya yo tengo como tu me dices pero con $HTTP_POST_FILES, que lo cambiare a $_FILES

y con respecto al GET, yo estoy utilizando session

entoces con respecto al primero y el segundo el codigo quedaria asi?

Código PHP:
<? 
session_start
(); 

$cedula$_SESSION["cedula"]; 

//datos del arhivo 
$nombre_archivo $_FILES['userfile']['name']; 
$tipo_archivo $_FILES['userfile']['type']; 
$tamano_archivo $_FILES['userfile']['size']; 
//compruebo si las características del archivo son las que deseo 
if (!((strpos($tipo_archivo"jpeg")) && ($tamano_archivo 100000))) { 

    if(
$_SESSION["autorizacion"]=="si"


            
             
             
?> 
              
         <script type='text/javascript' language='javascript'> 
         alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo')  
         document.location.href='alumnos/infoalum.php'     
         </script>  
          
         <? 
         

         else 
         { 
         
?> 
           
          <script type='text/javascript' language='javascript'> 
         alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo')  
         document.location.href='profesor/infoprofe.php'     
         </script>  
          <?  
          

     
     
}else{ 
    if (
move_uploaded_file($_FILES['userfile']['tmp_name'], "fotos/".$nombre_archivo) && rename("fotos/".$nombre_archivo,"fotos/".$cedula.".jpg")){ 
             
    if(
$_SESSION["autorizacion"]=="si"


            
             
             
?> 
              
         <script type='text/javascript' language='javascript'> 
         alert('SU IMAGEN FUE SUBIDA DE FORMA EXITOSA')  
         document.location.href='alumnos/infoalum.php'     
         </script>  
          
         <? 
         

         else 
         { 
         
?> 
           
          <script type='text/javascript' language='javascript'> 
         alert('SU IMAGEN FUE SUBIDA DE FORMA EXITOSA')  
         document.location.href='profesor/infoprofe.php'     
         </script>  
          <?  
          

    }else{ 
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse."
    } 

?>
  #6 (permalink)  
Antiguo 12/07/2010, 12:55
rpv
 
Fecha de Ingreso: febrero-2010
Mensajes: 275
Antigüedad: 9 años, 10 meses
Puntos: 10
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

Sí, solo es cambiar una variable por la otra, respecto al uso de strpos:

Código PHP:
Ver original
  1. if ((strpos($tipo_archivo,'image/jpeg')!==false||strpos($tipo_archivo,'image/jpg')!==false)&&$tamano_archivo<100000)

debes tomar en cuenta los dos tipos, no se si sea cosa del navegador o del software con el que se guarda las imágenes, pero se puede enviar con cualquiera de esos dos mime types.

Respecto a la seguridad: solo es explotable si haces las inclusiones desde variables de la url como en el ejemplo.
  #7 (permalink)  
Antiguo 12/07/2010, 14:25
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

sustituyendo la parte del codigo por la que me dices me muestra un error



Parse error: syntax error, unexpected ')' in /home/xxxxx/xxxxxx.com/xxxxxxx/htdocs/subearchi.php on line 12
  #8 (permalink)  
Antiguo 12/07/2010, 14:28
rpv
 
Fecha de Ingreso: febrero-2010
Mensajes: 275
Antigüedad: 9 años, 10 meses
Puntos: 10
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

es por las llaves al final:

Código PHP:
Ver original
  1. if((strpos($tipo_archivo,'image/jpeg')!==false||strpos($tipo_archivo,'image/jpg')!==false)&&$tamano_archivo<100000){
  #9 (permalink)  
Antiguo 12/07/2010, 14:42
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

ahora me sale el mensaje de error que yo coloco mas adelante


<script type='text/javascript' language='javascript'>
alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo')
document.location.href='alumnos/infoalum.php'
</script>

y estoy subiendo un archivo tipo .jpeg y pesa 65 KB
  #10 (permalink)  
Antiguo 12/07/2010, 15:12
rpv
 
Fecha de Ingreso: febrero-2010
Mensajes: 275
Antigüedad: 9 años, 10 meses
Puntos: 10
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

es un error lógico amigo, tienes el código en el segmento equivocado del if, lo tienes:

if(requerimientos_de_archivo_cumplidos){
muestra_mensajes_de_error
}else{
sube_la_imagen
}

cuando debe ser:

if(requerimientos_de_archivo_cumplidos){
sube_la_imagen
}else{
muestra_mensajes_de_error
}
  #11 (permalink)  
Antiguo 12/07/2010, 15:42
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

es extraño el problema porque si lo coloco asi
Código PHP:
<? if ((strpos($tipo_archivo,'image/jpeg')!==false)&&$tamano_archivo<100000?>
no me funciona, pero si le quito el ! que esta al lado de ==false osea asi

Código PHP:
<? if ((strpos($tipo_archivo,'image/jpeg')==false)&&$tamano_archivo<100000?>
me funciona bien, yo se que alli le estoy diciendo que si no es Jpeg me la acepte, pero de la otra forma no funciona y estoy probando es con las imagenes de muestra que trae el windows xp, la de la puesta de sol
  #12 (permalink)  
Antiguo 12/07/2010, 16:16
rpv
 
Fecha de Ingreso: febrero-2010
Mensajes: 275
Antigüedad: 9 años, 10 meses
Puntos: 10
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

con esta función se debe usar este tipo de operador ya que el formato retornado por esta función es un tanto `especial`, checa la documentación oficial:

Cita:
This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE, such as 0 or "". Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.
como te digo, es un error de lógica, deberías cambiarlo de la forma que te indico:


if(requerimientos_de_archivo_cumplidos){
muestra_mensajes_de_error
}else{
sube_la_imagen
}

cuando debe ser:

if(requerimientos_de_archivo_cumplidos){
sube_la_imagen
}else{
muestra_mensajes_de_error
}


o bien cambiar la condición:


Código PHP:
Ver original
  1. if(strpos($tipo_archivo,'image/jpeg')===false&&$tamano_archivo>100000){

de esta forma la lógica quedaría:

if(requerimientos_de_archivo_NO_cumplidos){
muestra_mensajes_de_error
}else{
sube_la_imagen
}
  #13 (permalink)  
Antiguo 12/07/2010, 19:11
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

bueno tal parece que ahora si funciona sin problemas

aqui dejo el codigo por si alguien lo necesita, Muchas Gracias por la ayuda

Código PHP:
<?       session_start();  

         
$cedula$_SESSION["cedula"];  

         
//datos del arhivo  
         
$nombre_archivo $_FILES['userfile']['name'];  
         
$tipo_archivo $_FILES['userfile']['type'];  
         
$tamano_archivo $_FILES['userfile']['size'];  
         
//compruebo si las características del archivo son las que deseo  
if ((strpos($tipo_archivo,'image/jpeg')!==false)&&$tamano_archivo<100000
{  
if (
move_uploaded_file($_FILES['userfile']['tmp_name'], "fotos/".$nombre_archivo) && rename("fotos/".$nombre_archivo,"fotos/".$cedula.".jpg"))
{  
            if(
$_SESSION["autorizacion"]=="si")  
{  
?>  
         <script type='text/javascript' language='javascript'>  
         alert('SU IMAGEN FUE SUBIDA DE FORMA EXITOSA')   
         document.location.href='alumnos/infoalum.php'      
         </script>   
<?  
}  
else  
{  
?>  
          <script type='text/javascript' language='javascript'>  
         alert('SU IMAGEN FUE SUBIDA DE FORMA EXITOSA')   
         document.location.href='profesor/infoprofe.php'      
         </script>  
<?   
}       
} else    {  
echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";  
} }    else {  
                        if(
$_SESSION["autorizacion"]=="si")  

{
?> 
         <script type='text/javascript' language='javascript'>  
         alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo')   
         document.location.href='alumnos/infoalum.php'      
         </script>   
<?  
} else  {  
?>  
         <script type='text/javascript' language='javascript'>  
         alert('LA EXTENSI'+"\u00d3"+'N O EL TAMA'+"\u00d1"+'O DE LOS ARCHIVOS NO ES CORRECTA \n-se permiten archivos .jpg \n-se permiten archivos de 100 kb m'+"\u00e1"+'ximo')   
         document.location.href='profesor/infoprofe.php'      
         </script>  
<? } } ?>
  #14 (permalink)  
Antiguo 12/07/2010, 22:57
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 16 años, 4 meses
Puntos: 21
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

como nota recuerda siempre usar un llave encriptada en los formularios
para enviar
__________________
gerardo

Última edición por chalchis; 12/07/2010 a las 23:20
  #15 (permalink)  
Antiguo 12/07/2010, 23:20
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

llave encriptada en los formularios?

me podrias explicar?
  #16 (permalink)  
Antiguo 12/07/2010, 23:25
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 16 años, 4 meses
Puntos: 21
De acuerdo Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

puedes leer este post es muy bueno

http://net.tutsplus.com/tutorials/ph...ith-form-keys/

saludos
__________________
gerardo
  #17 (permalink)  
Antiguo 12/07/2010, 23:38
 
Fecha de Ingreso: junio-2010
Ubicación: Venezuela, Zulia
Mensajes: 686
Antigüedad: 9 años, 5 meses
Puntos: 55
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

ya lo lei un poco y se ve algo engorroso por lo menos alli en esa pagina que me diste de ejemplo
  #18 (permalink)  
Antiguo 12/07/2010, 23:42
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 16 años, 4 meses
Puntos: 21
Respuesta: Que problemas de seguridad puedo tener al dejar subir imagenes

tomalo como una consideración...

saludos.
__________________
gerardo

Etiquetas: dejar, imagenes, seguridad, subir
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 17:33.