Usa PHP per controllare il file di immagine caricato per il malware?

2

Voglio che i miei utenti siano in grado di caricare una foto. Al momento non sto controllando la foto caricata per problemi di alcun tipo, sebbene io limiti la dimensione a 32k. C'è un modo per me per controllare i file di immagine caricati per malware? Per esempio, c'è un server là fuori che esegue ClamAV a cui posso accedere da PHP? Grazie.

    
posta Frank E 08.01.2013 - 16:05
fonte

6 risposte

3

Il meglio che posso pensare per PHP è ricreare l'immagine, ad esempio:

$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);

Quindi elimina l'immagine caricata originariamente e mantieni la tua copia ridimensionata.

    
risposta data 27.03.2013 - 15:25
fonte
2

Penso che l'approccio migliore sarebbe utilizzare una soluzione combinata:

  • Scansiona il file utilizzando un antivirus
  • Controlla il tipo MIME del file
  • Esegui le dimensioni del file controlla che Cristi sia descritto qui
  • Carica il file caricato in una libreria di immagini e salvalo di nuovo (potresti già farlo se stai ridimensionando le immagini)

Usando tutti questi controlli, la possibilità di un attacco riuscito sarebbe molto più piccola.

    
risposta data 10.01.2013 - 18:03
fonte
1

Come dice Christian, la soluzione migliore è inserire nella whitelist e verificare il tipo di file, tuttavia qualsiasi file che abbia metadati non compressi può potenzialmente essere un viale per attaccare un server web . Elimina i metadati.

Invocare il correttore virus in modo sincrono dalla richiesta web è una pessima idea in termini di prestazioni, stabilità e disponibilità. Mentre il gestore di upload predefinito in PHP mette i file in modo sensato e ti costringe a spostarli prima che la richiesta venga completata - questo significa che dovrai copiare il file ancora una volta dopo averlo scannerizzato.

    
risposta data 09.01.2013 - 21:42
fonte
1

Non una risposta completa *, ma un modo per filtrare i contenuti indesiderati sarebbe utilizzare le funzioni di manipolazione delle immagini di PHP per trasporre l'immagine caricata in una nuova immagine e quindi salvarla, piuttosto che i dati caricati. Un po 'come fare uno screenshot di una foto piuttosto che salvare la foto direttamente.

* = Oppure la soluzione migliore o più semplice ...

    
risposta data 10.01.2013 - 10:32
fonte
1

Una buona pratica è quella di verificare se l'immagine caricata è davvero un'immagine e non qualcos'altro. Convalidare un'immagine è più sicuro rispetto alla scansione con un antivirus.

La funzione getimagesize () determinerà la dimensione di ogni dato file immagine e restituirà le dimensioni lungo con il tipo di file e una stringa di testo altezza / larghezza da utilizzare all'interno di un normale tag HTML IMG e del tipo di contenuto HTTP corrispondente. La funzione supporta molti formati di immagine.

Puoi utilizzare getimagesize() per eseguire più cose contemporaneamente:

  • Convalida che il file è un'immagine
  • Consenti solo alcuni tipi di immagine
  • Consenti solo le dimensioni desiderate
  • Determina MIME type dell'immagine che può essere utilizzata per fornire immagini con l'header Content-type HTTP corretto

    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] e $array[1] sono la larghezza e l'altezza dell'immagine.

  • $array[2] ha il tipo di immagine.

Tieni presente che i video MPEG vengono rilevati come IMAGETYPE_ICO .

    
risposta data 08.01.2013 - 18:59
fonte

Leggi altre domande sui tag