2011-06-17 17 views
5

Digamos que puede cargar cualquier archivo que desee a un servidor, pero la extensión de archivo DEBE ser ".jpg". ¿Sería capaz de subir algo que pueda dañar el servidor?¿Es importante verificar que el archivo cargado sea un archivo de imagen real?

El objetivo de mi pregunta es que la verificación del tipo de archivo es lenta, y preferiría solo verificar la extensión si es lo suficientemente segura. Tengo problemas para imaginar un escenario donde se pueda usar malware disfrazado como una imagen.

he visto recomendaciones para el uso de getimagesize() para verificar una imagen, pero esta función es bastante lento, y no puedo averiguar si es necesario, o incluso efectiva, para prevenir las subidas de malware ...

Cualquier información sobre esto es muy apreciada.

+0

¿Funciona al marcar el tipo MIME? Realmente no desea tener scripts PHP en su servidor, incluso si tiene una extensión jpg no son tan peligrosos (y ni siquiera estoy seguro de eso) – Julien

+4

Dudo que la lentitud de la verificación del tipo de archivo sea comparable a el proceso de carga http en sí. – mario

+0

la velocidad de la función no debería importar ya que la ejecutará directamente después de la carga, que ningún usuario espera ser instantánea de todos modos. Yo diría que simplemente use http://www.php.net/manual/en/book.fileinfo.php y termine con eso y nunca tendrá que preocuparse. – castis

Respuesta

3

Si cree getimagesize() es un poco demasiado lento (porque todos los archivos subidos se hacen en súper alta velocidad tal como la conocemos;)), puede intentar la fileinfo library como bien. Inspecciona al menos algunos bytes dentro del archivo. Es bastante rápido, lo uso todos los días para cientos de archivos en una aplicación que debe ejecutarse rápidamente y lo hace.

Sin embargo, lo que no verifica no lo sabe. Probablemente, primero verifique la extensión, asegure un nombre de archivo seguro y una tienda segura, y que se envíen correctamente al cliente.

Antes de permitir que cualquier biblioteca de imágenes lo toque (y esto debería incluir los que están en las computadoras de los usuarios de su sitio), por razones de seguridad, el archivo debe escanearse con un escáner de virus. Eso es mucho más lento en comparación con getimagesize(), otros sugieren echar un vistazo al archivo para detectar cualquier caso de <?php y para evitar cargarlo como carga útil. Naturalmente, esto incluye verificar los archivos phar si la inclusión no se previene a través de la configuración de seguridad de las instalaciones PHP (por ejemplo, suhosin)

Al lado de la detección de virus a petición, los archivos almacenados se deben revisar periódicamente una y otra vez debido a exploits desconocidos

Así que parte de esto es siempre un trabajo de fondo. Pero incluso los cheques en tiempo real bajo demanda a menudo no toman mucho tiempo a menos que su aplicación cargue todo el tiempo. Es posible que desee introducir algo de cola de carga, por lo que la carga ya está hecha, pero el archivo estará disponible para el cargador una vez que se hayan ejecutado las tareas necesarias.

4

Para probar la seguridad de las imágenes, realmente solo uso un método: simplemente vuelva a crear la imagen con GD o con la biblioteca de procesamiento de imágenes que esté usando, y use la nueva imagen.

Esto debería hacer que el archivo sea perfectamente seguro si tiene versiones actualizadas de su biblioteca.

Puede hacer que sus cosas sean un poco más lentas, pero cuanto más seguro mejor.

Al solo marcar si hay un '.jpg' al final del nombre de un archivo no hará nada. El archivo puede ser cualquier tipo de archivo.

Espero que esto sirvió!

+2

Y, por el contrario, si tiene versiones obsoletas de la biblioteca, se atornillará si hay exploits. –

+0

¡Es cierto! Personalmente, prefiero confiar en la persona que hizo la codificación de GD en la mía, por lo que diría que incluso una versión obsoleta de una biblioteca de procesamiento de imágenes sería preferible. –

+0

Cualquier biblioteca fallará si envía una imagen simulada que tiene un tamaño enorme dentro de sus encabezados para el tamaño de la imagen pero es pequeña. Envíe un montón de solicitudes de carga y consumirá recursos en el servidor. – hakre

4

Parece que solo verificar la extensión no es seguro. Nocivo para el servidor? Es difícil de decir, sin conocer el sistema operativo del servidor, permisos sobre los archivos cargados, etc. Definitivamente no desea permitir que estos se ejecuten. Sin duda se abusa fácilmente al permitir a los usuarios cargar imágenes que no sean imágenes, luego cambian el nombre a lo que realmente es cuando sus amigos lo descargan. Esta es la forma en que usted se encuentra alojado, sin saberlo, películas piratas, warez, etc ..

+0

perspectiva interesante. gracias por esto. – dqhendricks

+0

Creo que ese es el punto más importante incluso. Es un viejo truco. Otra es falsificar los encabezados de los archivos o anexarlos al archivo original. – hakre

0

Otro efecto secundario de no verificar si se trata de una imagen es cuándo y si debe mostrarla en algún lugar del sitio web (en el perfil del usuario, en la portada, etc.) y si no es realmente una imagen , aparecerá roto, y por lo tanto, su sitio aparecerá roto.

En cuanto al malware que se inyecta, eso depende de la configuración de su servidor. Si no se ha actualizado para proteger agujeros y exploits, entonces sí, el malware puede infiltrarse a través (aunque eso es raro, pero posible).

Cuestiones relacionadas