Tengo un formulario de carga creado en php en mi sitio web donde la gente pueda subir un archivo zip. El archivo zip se extrae y todas las ubicaciones de los archivos se añaden a una base de datos. El formulario de carga es para la gente a subir fotos sólo, obviamente, con los archivos dentro del zip en la carpeta no puedo comprobar lo que los archivos se cargan hasta que el archivo se ha extraído. Necesito una pieza de código que se elimine todos los archivos que no son formatos de imagen (.png, .jpeg, etc). Estoy muy preocupado de que la gente pueda subir maliciosos, archivos php, gran riesgo de seguridad! Yo también deben ser conscientes de que la gente de cambiar las extensiones de los archivos php tratando de conseguir alrededor de esta característica de seguridad.

Este es el script original que he usado http://net.tutsplus.com/videos/screencasts/how-to-open-zip-files-with-php/

Este es el código que realmente extractos de el .archivo zip:

function openZip($file_to_open) {
    global $target;

    $zip = new ZipArchive();
    $x = $zip->open($file_to_open);
    if($x === true) {
        $zip->extractTo($target);
        $zip->close();

        unlink($file_to_open);
    } else {
        die("There was a problem. Please try again!");
    }
}

Gracias, Ben.

InformationsquelleAutor Ben McRae | 2009-03-02

10 Comentarios

  1. 65

    Lo que a mí me preocupa que la gente pueda subir maliciosos, archivos php, gran riesgo de seguridad!

    Punta del iceberg!

    yo también deben ser conscientes de que la gente de cambiar las extensiones de los archivos php tratando de conseguir alrededor de esta característica de seguridad.

    Generalmente de cambiar las extensiones dejará de PHP a partir de la interpretación de los archivos de secuencias de comandos. Pero ese no es el único problema. Hay más cosas que «…php’, que puede dañar el lado del servidor; ‘.htaccess’ y archivos con el bit X conjunto son los más obvios, pero eso no significa que todo lo que tiene que preocuparse. Incluso ignorando el lado del servidor de cosas, hay un gran cliente del lado del problema.

    Por ejemplo, si alguien puede subir una ‘.html’ archivo, que puede incluir un <script> etiqueta que secuestra a una tercera parte de la sesión de usuario, y borra todos sus archivos subidos o cambia su contraseña o algo. Este es un clásico de cross-site-scripting (XSS) ataque.

    Además, gracias al contenido de oler el comportamiento de algunos navegadores (principalmente IE), un archivo que esté cargado como».gif puede contener HTML malicioso como este. Si internet explorer se ve indicadores luminosos como (pero no limitado a) ‘<html>’ cerca del inicio del archivo se puede ignorar el ‘Tipo de Contenido’ y mostrar como HTML, lo que resulta en XSS.

    Además, es posible elaborar un archivo que se tanto una imagen válida de su imagen parser de aceptar, y contiene incrustado en HTML. Hay varios resultados posibles, dependiendo de la versión exacta del navegador del usuario y el formato exacto del archivo de imagen (Jpeg, en particular, tienen un muy variable de un conjunto de posibles formatos de encabezado). Hay mitigaciones que viene en IE8, pero que no por ahora, y usted tiene que preguntarse por qué no pueden simplemente dejar de hacer contenido para oler, que idiotas MS en lugar de sobrecargar nos shonky no estándar de las extensiones de los encabezados HTTP que debería haber Trabajado en el primer lugar.

    Yo estoy cayendo en una diatriba de nuevo. Voy a parar. Tácticas para servir suministrado por el usuario, las imágenes de forma segura:

    1: Nunca guarde un archivo en el servidor del sistema de ficheros usando un nombre de archivo tomada de la entrada del usuario. Esto evita errores así como de los ataques: sistemas de ficheros diferentes tienen diferentes reglas sobre lo que los personajes son permisibles en donde en un nombre de archivo, y es mucho más difícil de lo que usted podría pensar que para «higienizar’ los nombres de archivo.

    Incluso si usted tomó algo muy restrictivas como «solo ASCII de las letras», usted todavía tiene que preocuparse demasiado larga, demasiado corto, y los nombres reservados: intentar guardar un archivo con tan inocuas un nombre como «com.txt» en un servidor de Windows y ver su aplicación a ir hacia abajo. Crees que sabes todas las extrañas manías de nombres de ruta de acceso de cada sistema de ficheros en los que su aplicación podría correr? Seguro?

    Lugar, el archivo de almacén de datos (como el nombre y los medios de comunicación-tipo) en la base de datos, y el uso de la clave principal como un nombre en su filestore (por ejemplo. «74293.dat»). Luego necesitas una manera de servir a ellos con diferentes aparente nombres de archivo, como un downloader de secuencia de comandos de escupir el archivo de salida, un downloader script para hacer un servidor web interno de la redirección, o la reescritura de URL.

    2: Ser muy, muy cuidadosos con ZipArchive. Ha habido cruce de vulnerabilidades en extractTo de la misma especie que han afectado a la mayoría de los ingenuos ruta de acceso basado en ZIP extractores. Además, póstrate abierto al ataque de POSTAL de bombas. Mejor evitar cualquier peligro de malos nombres, recorriendo cada entrada del archivo en el archivo (por ejemplo. el uso de zip_read/zip_entry_*) y comprobar su información antes de que manualmente desembalaje de su flujo a un archivo con conocidos-el buen nombre y el modo de banderas, que ha generado sin el archivo de ayuda. Ignorar las rutas de carpeta dentro del ZIP.

    3: Si usted puede cargar un archivo de imagen y volver a guardarlo de nuevo, especialmente si el proceso es de alguna manera entre (tales como cambiar el tamaño de/en miniatura, o agregar una marca de agua) puede estar razonablemente seguro de que los resultados serán limpias. En teoría podría ser posible hacer una imagen que captó una imagen en particular compresor, de manera que cuando se comprimen los resultados también parecen HTML, pero que parece muy difícil de ataque para mí.

    4: Si usted puede conseguir lejos con el servicio a todas sus imágenes como las descargas (es decir. el uso de ‘Content-Disposition: attachment’ en un downloader de secuencia de comandos), es probablemente seguro. Pero eso podría ser demasiado inconveniente para los usuarios. Esto puede funcionar en tándem con (3), sin embargo, la porción más pequeña, procesado de imágenes en línea y tener el original de la más alta calidad de imágenes disponible como una descarga sólo.

    5: Si debe servir inalteradas las imágenes en línea, usted puede quitar el cross-site-scripting riesgo por servir desde un dominio diferente. Por ejemplo, use «images.example.com’ para los que no son de confianza imágenes y ‘www.example.com’ para el sitio principal que tiene toda la lógica. Asegúrese de que las cookies están limitados a sólo el correcto host virtual, y que los hosts virtuales se configuran de modo que no puede responder en cualquier cosa, pero sus nombres propios (ver también: DNS de reconsolidación de los ataques). Esto es lo que muchos de los servicios de webmail hacer.

    En resumen, el usuario envía contenido de los medios es un problema.

    Resumen del resumen, AAAARRRRRRRGGGGHHH.

    ETA re comentario:

    en la parte superior se menciona acerca de archivos con el bit X set’, ¿qué quiere usted decir con eso?

    No puedo hablar por ZipArchive.extractTo() como yo no lo he probado, pero muchos extractores, cuando se les preguntó a los archivos de volcado de un archivo, recrear [algunos de] los archivos de Unix modo de indicadores asociados a cada archivo (si el archivo fue creado en Unix y en realidad cuenta el modo de banderas). Esto puede causar problemas de permisos si, por ejemplo, el titular de permiso de lectura es la que falta. Pero también puede ser un problema de seguridad si su servidor CGI-enabled: un bit X puede permitir que el archivo pueda ser interpretada como una secuencia de comandos y se pasa a cualquier intérprete de comandos enumerados en el hashbang en la primera línea.

    pensé .htaccess tenía que estar en el directorio raíz, no es éste el caso?

    Depende de cómo se instale Apache, en particular la directiva AllowOverride. Es común que de propósito general hosts AllowOverride en cualquier directorio.

    ¿qué pasaría si alguien todavía cargado un archivo como ../var/www/wr_dir/evil.php?

    Yo esperaría que el líder ‘..’ sería descartada, que es lo que otras herramientas que han sufrido la misma vulnerabilidad que han hecho.

    Pero aún así yo no la confianza extractTo() contra hostil de entrada, hay demasiadas poco raro nombre de archivo/directorio-árbol de cosas que pueden salir mal — especialmente si usted está esperando siempre a ejecutar en los servidores de Windows. zip_read() le da un control mucho mayor sobre el dearchiving proceso, y por lo tanto el atacante mucho menos.

    • Hola bobince, gracias por la gran respuesta. en la parte superior se menciona acerca de archivos con el bit X set’, ¿qué quiere usted decir con eso? y también, pensé .htaccess tenía que estar en el directorio raíz, no es éste el caso? gracias.
    • una pregunta más,con la vulnerabilidad(unflatterned archivos), en la extractTo función de la ZipArchive clase.Asumo que no tiene que preocuparse acerca de esto, porque yo uso la versión de php 5.2.8 y la corrección en la versión 5.2.7?¿qué pasaría si alguien todavía cargado un archivo como ../var/www/wr_dir/evil.php?
    • +1, Impresionante respuesta, muy conscientes de la seguridad – una bonita!
  2. 15

    Primero que se debe prohibir todos los archivos que no tienen una buena imagen de la extensión de archivo. Y después de eso, usted podría utilizar el getimagesize función para comprobar si los archivos son habituales de los archivos de imagen.

    Pero además se debe tener en cuenta que algunos formatos de imagen permitir comentarios y otros metadatos. Esto se puede utilizar para el código malicioso como JavaScript que algunos navegadores se ejecutará bajo ciertas circunstancias (ver Arriesgado examen de MIME en Internet Explorer).

  3. 9

    Usted probablemente no debería confiar sólo en la extensión de nombre de archivo, entonces. Intentar pasar cada archivo a través de una biblioteca de imágenes para validar que su realmente una imagen, también.

    • Hola, gracias por la rápida respuesta! nunca he oído hablar de este método antes. ¿Cómo puedo pasar los archivos a través de una imagen de la biblioteca?
    • Trate de WideImage para PHP. Intento de carga y compruebe la imagen en base a su nombre de archivo. Detectar los errores que se producen y vas a saber si fue por lo menos una imagen válida para el formato especificado.
    • Después de todos estos años nunca había considerado esto como una solución. Gracias!
  4. 2

    No veo el riesgo de haber cambiado el nombre de los archivos php en tu DB…
    Mientras usted no está evaluando como archivos PHP (o, para el caso), no pueden hacer mucho daño, y ya que no hay .extensión de php, el motor de php no los va a tocar.

    Supongo que también podría buscar en los archivos de <?php

    También: se supone que el peor de los archivos subidos a su máquina. Cambiado el nombre de la carpeta en la que vas a guardar en ellos «virus» y tratarlo en consecuencia. No hacerlo público, no dar ningún archivo de permisos de inicio (especialmente el de usuario de php), etc.

    • no estoy tan preocupado acerca de lo que entró en la base de datos, sólo el real php archivos en la carpeta extraída donde alguien podría ser capaz de ejecutar más tarde. Aslong como no hay archivos php no se puede leer, supongo que eso no es tan malo.
  5. 1

    Ahora usted está confiando en su disco duro espacio para la extracción. Usted puede comprobar fileheaders para determinar qué tipo de archivos son. probablemente las bibliotecas para que.

    offtopic: no es mejor dejar que el usuario seleccione el par de imágenes en lugar de subir un archivo zip. Mejor para la gente que no sabe lo que zip es (sí, existen)

    • Hola PoweRoy, idealmente que era lo que yo quería implementar. Pero para las personas que tienen grandes inventarios y se necesitaría bastante tiempo para mi a los usuarios subir cada imagen de forma individual. Así que esta es la mejor forma posible sin que me de perder clientes. ¿Cuáles son estas bibliotecas usted mencionó? Gracias, Ben.
    • Para varios archivos, pensé que esto es posible en el desarrollo web, veo que esto no lo es. Usted puede tratar de java, pero si eso es una solución deseada… Para las bibliotecas, véase Juan Ellinwood anser.
  6. 1

    Si usted configurar php para que sólo analiza los archivos que terminan con .php, a continuación, puede cambiar el nombre de un archivo de somename.php a somename.php.jpeg y están a salvo.

    Si usted realmente desea eliminar los archivos, hay un postal de la biblioteca disponible para php. Usted podría utilizar para comprobar los nombres y las extensiones de todos los archivos dentro del archivo zip subido, y si contiene un archivo php, dar al usuario un mensaje de error.

  7. 1

    Personalmente, me gustaría añadir algo a la configuración de Apache para asegurarse de que no sirve de archivos PHP como texto a partir de la ubicación de los archivos subidos, así que estás a salvo, y puede permitir a otros tipos de archivo a ser cargado en el futuro.

  8. 0

    Uso de la función getimagesize.
    Procedimiento completo:-
    1.) Extracto de la extensión de la imagen/archivo cargado y, a continuación, compare extensión con permitía la extensión.
    2.) Ahora crear una cadena aleatoria para cambiar el nombre del archivo cargado. la mejor idea es md5(session_id().microtime()).No se puede duplicar y si el servidor es muy rápido y puede procesar menos de un microsegundo de uso incrementa la variable y añadirlos con la cadena.
    ahora mueva el archivo.

    Una punta
    Deshabilitar PHP procesamiento de archivos en el directorio de carga, siempre prevenir cualquier lado del servidor ataque y si es posible agregar tu htaccess en el directorio raíz o en httpd archivo de configuración y deshabilitar archivos htaccess desde allí, ahora es resolver el máximo de problemas

Dejar respuesta

Please enter your comment!
Please enter your name here