Foros del Web » Programando para Internet » PHP »

Mejora en la subida

Estas en el tema de Mejora en la subida en el foro de PHP en Foros del Web. Buenas tengo un php que procesa y sube archivos, como puedo hacer para limitar los archivos que subo en tamñana y extencion. Y en el ...
  #1 (permalink)  
Antiguo 24/08/2006, 18:00
 
Fecha de Ingreso: agosto-2006
Ubicación: Argentina, Bahia Blanca
Mensajes: 172
Antigüedad: 17 años, 8 meses
Puntos: 0
Pregunta Mejora en la subida

Buenas tengo un php que procesa y sube archivos, como puedo hacer para limitar los archivos que subo en tamñana y extencion. Y en el caso de que no suba nada me cargue una imagen por defecto.
Muchas gracias
Mi php es el sigueinte:

Código PHP:
$uploadDir 'bahia/';
$banner $uploadDir $_FILES['banner']['name'];
print 
"<pre>";
if (
move_uploaded_file($_FILES['banner']['tmp_name'], $banner))
{    
}
else
{
   }
print 
"</pre>"
  #2 (permalink)  
Antiguo 24/08/2006, 18:13
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 19
para saber el tamaño del archivo lo podes hacer con la funcion filesize()

para saber la extension deberias usar la funcion sxplode() que te permite separar el contenido de una cadena y ponerlo en un vector, verificas el ultimo registro del vector, y lo comparas con la extension que desees !!!

saludos

PD. trata de usar el buscador...
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!
  #3 (permalink)  
Antiguo 24/08/2006, 18:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
En el array $_FILES tienes todos los datos para realizar validaciones.

Por ejemplo:
$_FILES['banner']['size'] tienes el tamaño del archivo que subistes.

$_FILES['banner']['type'] tienes el formato MIME del archivo que subió. Esto es más seguro que ver extensiones de archivos en su nombre .. el cual puede ser "adulterado" .. imagina que subo un .exe a tu servidor camuflado con nombre .txt ... tu validación pasaría si lo haces por el nombre del archivo .. con "type" no .. pues se mira el archivo "fisicamente" y sus cabeceras ..(el formato "MIME" del mismo)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 24/08/2006, 22:27
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Buenas, en esta ocasión disiento con Cluster.

Si tomás un archivo .exe y lo renombrás como .txt, el mime-type que te va a mostrar el array $_FILES es text/plain. (Hacé la prueba vos mismo).

El mime-type no es ninguna garantía porque es un dato que entrega el cliente y los headers de un archivo también se pueden modificar a gusto con cualquier editor hexadecimal (hay que conocer el formato, lógico, pero se puede hacer; algunos formatos son muy simples).

No conozco en detalle qué es lo que hace un navegador como el IE o el FF con respecto al mime-type que entrega, pero tiene toda la pinta de que si tiene una extensión a mano, simplemente busca el mime asociado a esa extensión y listo (con un par de pruebas podés comprobar que el mime-type que envía es siempre el que está asociado a la extensión del archivo, o application/octect-stream si no lo conoce o no hay extensión).

Tengo la impresión de que validar por mime-type suele dar una (falsa) sensación de "seguridad" al que programa un upload. Dudo mucho que sea más seguro y le veo la contra anterior.

Otra cosa: si buscás en google vas a ver que páginas que explican exploits basados en validaciones de archivos por mime-types. No conozco el tema, pero por lo que explican, lo que hacen comunicarse directamente con el servidor (sin usar un broswer), imitar el envío algún mime-type arbitrario y el archivo a subir. Con esto podrían subir un archivo .php haciéndolo pasar por un .jpg, por ejemplo. Ahí habría un verdadero problema, porque si el archivo es .php, cualquiera lo puede ejecutar con sólo un navegador. Por eso creo que la extensión es lo más importante (de última, si alguien sube un .txt que en realidad contiene código .php, no va a poder hacerlo correr directamente; no es lo más tranquilizador, pero sería la "menos peor" de las dos opciones).

Y me parece que ahí está el punto importante. Suponiendo que el archivo no puede ejecutarse directamente, la seguridad depende de qué hagas vos con ese archivo. Partiendo de la base de que una de las peores cosas que podrían pasar es que alguien pudiera ejecutar código php a discresión, en la medida en que con ese archivo no hagas cosas como require(), include(), o usar eval() no veo por ese lado cómo podría alguien hacer algo con el archivo "malicioso" que acaba de subir. (Que no lo vea yo no quiere decir que no lo vea otro más avispado...)

Suerte
Califa

PD: Ya alguna vez había estado en una discusión muy parecida; por ahí debe andar algún link que dejé sobre este tema, si a alguien le interesa echarle un vistazo
  #5 (permalink)  
Antiguo 24/08/2006, 23:17
 
Fecha de Ingreso: agosto-2006
Ubicación: Argentina, Bahia Blanca
Mensajes: 172
Antigüedad: 17 años, 8 meses
Puntos: 0
De acuerdo Joya!

Muchas gracias por su tiempo, estoy avanzando usando el manual de php.
Gracias!
  #6 (permalink)  
Antiguo 25/08/2006, 06:24
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Si tomás un archivo .exe y lo renombrás como .txt, el mime-type que te va a mostrar el array $_FILES es text/plain. (Hacé la prueba vos mismo).
Hice unas pruebas en mis sistemas .. subí un .exe como tal y el mismo renombrado a .txt. Los subí desde una máquina Windows XP (con IE 6 de navegador) a mi servidor PHP 5 bajo Linux (Fedora 5), en ambos casos obtube en "type" como formato MIME del archivo:

application/octet-stream

No te discuto nada de lo que mencionas, sólo aporto la prueba que hice.

Digo no te discuto por qué muchos datos que "informa" el cliente en una conexión lo entrega el cliente .. así que si tu "simulas" tu cliente (por sockets) podras hacerte pasar por cualquier tipo de cliente, indicar un "REFERER" falso .. o incluso que tus datos son de tal formato MIME?.

Si la información del formato MIME va incrustrada en el código del archivo y tu lo editas .. por supuesto que vas a saltarte toda validación que hagas .. pero ... en ese caso ¿como validamos? .. nos guiamos por la extensión del archivo? ..

No he estudiado en profundidad que tan seguro pueda ser este método .. pero lo que puedo asegurar que es mejor ver el "MIME" que ver una extensión de un archivo .. Tal vez habría que combinar ambos métodos: extensión y MIME .. pero no depender de uno sólo, por qué ambos métodos tienen sus falencias .. algunos más simples de "saltar" y otros más complicados.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 25/08/2006 a las 06:35
  #7 (permalink)  
Antiguo 25/08/2006, 18:47
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Cita:
Hice unas pruebas en mis sistemas .. subí un .exe como tal y el mismo renombrado a .txt. Los subí desde una máquina Windows XP (con IE 6 de navegador) a mi servidor PHP 5 bajo Linux (Fedora 5), en ambos casos obtube en "type" como formato MIME del archivo:

application/octet-stream
Es extraño, entonces. Y tal vez me apresuré a sacar una conclusión sobre esto teniendo en cuenta lo que contás. Yo hice 3 pruebas, en mi máquina (XP-Apache 1.3-PHP 5) y en dos servidores Linux (RedHat uno, Fedora el otro si no me equivoco, ambos corren PHP 4). Los archivos los subí desde mi máquina con IE y FF y como conté, obtuve text/plain leyendo el array $_FILES.

En cuanto a que el mime es un dato que aporta el cliente y como tal debe ser tomado con precaución, estamos de acuerdo. Justamente, a eso apuntaba mi comentario.

De todos modos, más allá de la extensión, por las pruebas que hice (que están lejos de ser exhaustivas) el servidor no se "confunde" tan fácilmente los tipos de archivos; quiero decir, en mis tests, no basta con nombrar a un archivo como .txt, para que haga lo que hace normalmente con cualquier .txt (en todas las configuraciones que tengo, mostrarlo por pantalla). Si el archivo original era un .exe, fuerza una descarga (lo mismo si el archivo era un .swf, que normalmente se ejecutaría).

No sé la verdad cuán factible será lograr que el servidor acepte un archivo .php en caso de que valides por mime-type que este tipo de archivos no puedan subirse. Pero si pudiera lograrse, creo que ahí sí habría un problema. Porque después de subir el archivo, para que haga algo debería ejecutarse; y si fuera un php, se ejecutaría sin mayores inconvenientes.

Ese es uno de los dos problemas potenciales más graves que le veo a todo "upload". El otro está asociado y tiene que ver con los include/require dinámicos. No es lo más común pero vi algunos sitios "modulares" que hacen cosas como "script.php?modulo=abmtal.php" (donde el parámetro indica el archivo a incluir). Es un caso más bien burdo, pero los hay. En un caso así, combinado con un upload de un inocente "jpg" (que en realidad tiene código php y en mis pruebas pasó como mime-type image/jpeg), podría haber un hueco importante en la seguridad. E imagino que otros casos no tan groseros también pueden tener vulnerabilidades del estilo (aunque es cierto que requeriría de más tiempo, ingenio y "talento" descubrirlas).

Tampoco soy un experto en el tema, pero me parece que usar los métodos de validación como sugerís no estaría mal para agregar un poco más seguridad; y por otra parte no cuesta demasiado hacerlo, ambas validaciones son bastante sencillas, así que creo que es una buena idea.

Suerte
Califa
  #8 (permalink)  
Antiguo 25/08/2006, 19:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Toda precaución y validación es poca .. La seguridad que uno pueda desarrollar va siempre en funciòn de lo que uno conoce. Asì que por mi parte desde ahora validaría tanto el formato MIME del archivo como la extensión del archivo.

Un saludo
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 25/08/2006 a las 19:11 Razón: No encontrè referencia .. mejor lo omitimos.
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:14.