Sicurezza · 4 min read · Dec 08, 2025

Come Scansionare Automaticamente i File Caricati per Virus con php-clamavlib - Pagina 2

5 Un Piccolo Esempio

Ora creeremo un piccolo script di upload, /var/www/upload.php, che contiene un modulo HTML per il caricamento. Se invii il modulo, lo script chiamerà se stesso e utilizzerà cl_info(), cl_scanfile(), cl_setlimits() e clam_get_version() per scansionare il file caricato per virus. Se il file è ok, verrà caricato in /var/www/uploads, altrimenti lo script visualizzerà un messaggio di errore (indicando quale virus/verme ecc. ha trovato) e cancellerà il file sul server.

Prima di tutto, dobbiamo creare la directory /var/www/uploads e renderla scrivibile dal nostro utente Apache, www-data:

mkdir /var/www/uploads
chown www-data:www-data /var/www/uploads

Poi creiamo il file /var/www/upload.php:

vi /var/www/upload.php

| Versione ClamAV: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> Caricamento File

Caricamento File
 
Errore:
Il file è stato caricato con successo in !
File:
 
|

Contiene il modulo per caricare un file:

| [...]

Caricamento File
 
Errore:
Il file è stato caricato con successo in !
File:
 
[...]
|

Dopo aver selezionato un file e cliccato sul pulsante Invia, lo script si chiamerà da solo ( action=”upload.php”) ed eseguirà il codice PHP in cima:

| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= 'Per favore seleziona un file da caricare!'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'Abbiamo Malware: '.$malware.'
Versione ClamAV: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
|

I dettagli sul file caricato sono salvati nell’array $_FILES, quindi lo usiamo per controllare il file (puoi decommentare la riga print_r($_FILES); per vedere cosa è memorizzato nell’array).

Uso la funzione cl_setlimits() per impostare i limiti per il processo di scansione dei virus al fine di prevenire attacchi DOS (dove il processo di scansione dei virus potrebbe consumare tutte le risorse del sistema). L’uso è il seguente:

cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) 
  • $maxreclevel: valore intero / livello massimo di ricorsione /
  • $maxfiles: valore intero / numero massimo di file da scansionare all’interno dell’archivio /
  • $maxratio: valore intero / rapporto di compressione massimo /
  • $archivememlim: booleano / limita l’uso della memoria per bzip2 (0/1) /
  • $maxfilesize: intero lungo / i file archiviati più grandi di questo valore (in byte) non verranno scansionati /

Fondamentalmente, questi valori definiscono il comportamento di ClamAV se vengono scansionati archivi (file zip, file tar.gz, file bz2, ecc.). Se non utilizzi la funzione cl_setlimits(), i valori rispettivi vengono presi dal php.ini.

La funzione principale è la funzione cl_scanfile() che prende il percorso del file da scansionare come argomento. I file caricati vengono salvati temporaneamente (di solito in /tmp; dipende dalle impostazioni del tuo php.ini) prima di essere elaborati. Quel file temporaneo è salvato in $_FILES[‘file’][‘tmp_name’] quindi passiamo quella variabile alla funzione cl_scanfile(). Se non viene trovato alcun virus, restituisce FALSE, altrimenti il nome del virus trovato.

clam_get_version() non prende alcun argomento. Quella funzione restituisce la versione di ClamAV installato (come 0.88.4).

Infine utilizzo la funzione cl_info() che - come clam_get_version() - non prende alcun argomento. Mostra informazioni più dettagliate su ClamAV, ad esempio la versione ClamAV 0.88.4 con 85917 firme di virus caricate.

Ora testiamo. Digita http://192.168.0.100/upload.php nel tuo browser. Dovresti vedere questo:

Clicca su Sfoglia… e seleziona un file da caricare dal tuo disco rigido (un file che non è un virus e non più grande di 2MB - questa è la dimensione massima di upload predefinita che può essere cambiata nel tuo php.ini):

Il caricamento dovrebbe avere successo, e dovresti vedere qualcosa di simile:

Ora dobbiamo ottenere un virus per testare. Fortunatamente c’è il virus di test Eicar, è un file che non fa alcun danno, ma la sua firma è stata inclusa in tutti i scanner di virus in modo da poter testare se il tuo scanner di virus funziona utilizzando quel virus di test. Vai su http://www.eicar.org/anti_virus_test_file.htm e scarica i file eicar.com, eicar_com.zip e eicarcom2.zip sul tuo disco rigido. Poi testa il caricamento con ciascuno di essi:

Se tutto va bene, php-clamavlib dovrebbe riconoscere il virus e rifiutare il caricamento:

6 Link

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.