¿Usar PHP para revisar el archivo de imagen cargado en busca de malware?

2

Quiero que mis usuarios puedan subir una foto. Actualmente no estoy revisando la foto cargada por problemas de ningún tipo, aunque sí limito el tamaño a 32k. ¿Hay alguna forma de que compruebe los archivos de imagen cargados en busca de malware? Por ejemplo, ¿hay algún servidor que ejecute ClamAV al que pueda acceder desde PHP? Gracias.

    
pregunta Frank E 08.01.2013 - 16:05
fuente

6 respuestas

3

Lo mejor que puedo pensar de PHP es volver a crear la imagen, por ejemplo:

$src_file = '/your/tmp/image.tmp';
$dest_file = '/desired/file/location/img.jpg';
$img_quality = 70;

$im = imagecreatefromstring(file_get_contents($src_file));
$im_w = imagesx($im);
$im_h = imagesy($im);
$tn = imagecreatetruecolor($im_w, $im_h);
imagecopyresampled ( $tn , $im, 0, 0, 0, 0, $im_w, $im_h, $im_w, $im_h );
imagejpeg($tn,$dest_file,$img_quality);

Luego elimine la imagen cargada originalmente y mantenga su copia redimensionada.

    
respondido por el Timo Huovinen 27.03.2013 - 15:25
fuente
2

Creo que el mejor enfoque sería utilizar una solución combinada:

  • Escanee el archivo usando un antivirus
  • Comprueba el tipo MIME del archivo
  • Realice la comprobación de tamaño de archivo que Cristi describió aquí
  • Cargue el archivo cargado en una biblioteca de imágenes y guárdelo nuevamente (es posible que ya esté haciendo esto si está redimensionando las imágenes)

Al utilizar todos estos controles, la posibilidad de un ataque exitoso sería mucho menor.

    
respondido por el Dinu S 10.01.2013 - 18:03
fuente
1

Como dice Christian, la mejor solución es poner en la lista blanca y verificar el tipo de archivo; sin embargo, cualquier archivo que tenga metadatos sin comprimir puede ser potencialmente un avenue para atacar un servidor web . Eliminar los metadatos.

Invocar el comprobador de virus de forma sincrónica desde la solicitud web es una muy mala idea en términos de rendimiento, estabilidad y disponibilidad. Si bien el controlador de carga predeterminado en PHP hace que los archivos salgan del camino y lo obligue a moverlos antes de que se complete la solicitud, esto significa que tendrá que copiar el archivo una vez más después de escanearlo con virus.

    
respondido por el symcbean 09.01.2013 - 21:42
fuente
1

No es una respuesta completa *, pero una forma de filtrar contenido no deseado sería utilizar las funciones de manipulación de imágenes de PHP para transponer la imagen cargada en una nueva imagen y luego guardarla, en lugar de los datos cargados. Es como tomar una captura de pantalla de una imagen en lugar de simplemente guardarla directamente.

* = O la mejor solución, o la más fácil ...

    
respondido por el John U 10.01.2013 - 10:32
fuente
1

Una práctica buena y popular es verificar si la imagen cargada es realmente una imagen y no otra cosa. Validar una imagen es más seguro que escanear con un antivirus.

La función getimagesize () determinará el tamaño de cualquier archivo de imagen dado y devolverá las dimensiones a lo largo con el tipo de archivo y una cadena de texto de altura / anchura para usar dentro de una etiqueta IMG HTML normal y el tipo de contenido HTTP correspondiente. La función soporta muchos formatos de imagen.

Puedes usar getimagesize() para lograr varias cosas a la vez:

  • Valide que el archivo es una imagen
  • Solo permite algunos tipos de imagen
  • Solo permite tamaños deseados
  • Determine el MIME type de la imagen que se puede usar para entregar imágenes con el encabezado HTTP Content-type correcto

    function is_image($path)
        {
        $a = getimagesize($path);
        $image_type = $a[2];
    
        if (in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
        {
            return true;
        }
        return false;
    }
    
  • $array[0] y $array[1] son el ancho y el alto de la imagen.

  • $array[2] tiene el tipo de imagen.

Tenga en cuenta que los videos MPEG se detectan como IMAGETYPE_ICO .

    
respondido por el Cristian Dobre 08.01.2013 - 18:59
fuente

Lea otras preguntas en las etiquetas