Ver Mensaje Individual
  #20 (permalink)  
Antiguo 13/01/2006, 11:28
califa010
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Pero el problema no es el nombre del archivo o la extensión en sí, ni la estrucura interna, porque el asunto es que, justamente, el archivo puede ser código php, pero el mime-type puede estar "disfrazado" como "images/jpg", por ejemplo. Le hace creer al script que es una imagen, pero NO es una imagen; no hay ningún cambio en la estructura interna del archivo; es el mismo.

Supongamos que alguien hace un script que te borra todo el sitio (vi ejemplos en páginas sobre seguridad en php y con una línea de código alcanza). Supongamos que lo llama "borrar.php", pero para subirlo lo renombra como "borrar.jpg". Bien, en ese caso, si vos validás por extensión, el script va a subirse al servidor.

Pero la diferencia importante es que no va a poder ejecutarse directamente. O sea, sí podés poner en la barra del navegador "http://www.dominio.com/borrar.jpg", pero el script no se va a ejectuar.

En cambio, si esa misma persona te subiera ese archivo como "borrar.php", no desde tu formulario sino con una aplicación programada para "dibujar" el mime-type y hacerle creer al servidor que es una imagen, después de subirlo podría ejecutarlo inmediatamente y borrarte todo.

El tema es que como el mime-type es una dato que viene del cliente, en principio no es confiable. (Obvio que lo más probable es que todo ande bien, pero haciéndolo de esta manera, estás dando la posibilidad de que hagan lo que quieran en tu servidor...)

Es decir, lo más seguro es validar por extensión, no por mime-type. Es más un poco más largo y engorroso, pero la otra forma es potencialmente peligrosa.

Y otra cuestión directamente relacionada con ésta es tener mucho cuidado con los includes/require. En lo posible, deberían estar "harcodeados", o sea, no ser variables (y son son variables, hay fijarse muy bien que no dejen "huecos" para que alguien desde afuera manipule arbitrariamente el valor de esa variable).

Porque include hace que se ejecute código php, no importa que extensión tenga el archivo. Si el que te subió el archivo descubre algún lugar de tu aplicación donde hacés un include($variable) y vos dejaste la posibilidad de manipular esa variable, tranquilamente podría hacer que include($variable) terminara ejecutándose como include("borrar.jpg").

Bueno, cada uno lo hace como más le gusta o prefiere, pero me parece que estas cosas hay que saberlas y tenerlas en cuenta.

Saludos
Califa

Última edición por califa010; 13/01/2006 a las 11:50