PHP - utiliser clamav pour rechercher les virus dans les documents téléversés

Avant de traiter une pièce jointe téléchargée depuis le navigateur, il est souvent intéressant de rechercher si elle contient un virus ou non. La recherche antivirale s'effectue avec le logiciel Clamav (http://www.clamav.net), un antivirus opensource fonctionnant sur toutes plates-formes.

Installer clamav

Clamav est en principe disponible dans les dépôts des distributions classiques. Consultez néanmoins ce document, qui vous permettra notament de tester si votre installation est correcte :

https://wiki.archlinux.org/index.php/ClamAV

Installer php-clamav

Installez les bibliothèques de développement pour php5 et clamav :

sudo apt-get install php5-dev
sudo apt-get install libclamav-dev

Téléchargez php-clamav à partir de http://sourceforge.net/projects/php-clamav, puis compilez le module :

cd /tmp
tar xvzf php-clamav-0.15.8.tar.gz
cd php-clamav-0.15.8
phpize
./configure --with-clamav
make

Installez ensuite le module dans un dossier de votre serveur :

sudo mkdir -p /usr/local/lib/php5/extensions
sudo cp modules/clamav.so /usr/local/lib/php5/extensions/

Éditez le fichier /etc/php5/apache2/php.ini et, dans la section Dynamic Extensions, rajoutez l'entrée :

extension=/usr/local/lib/php5/extensions/clamav.so

Redémarrez le serveur Apache :

sudo service apache2 restart

Tester la prise en compte de clamav dans php

Récupérez le fichier de test :

wget -O- http://www.eicar.org/download/eicar.com.txt > /tmp/testvirus.txt

Modifiez ensuite le fichier phpclamav_test.php, en remplaçant le nom du fichier à tester par :

$file = "/tmp/testvirus.txt";

Recopiez le fichier phpclamav_test.php dans un dossier du serveur, par exemple :

sudo cp phpclamav_test.php /var/www/html/

Dans un navigateur, lancez le programme de test :

http://localhost/phpclamav_test.php

Le programme doit retourner les informations suivantes :

Functions available in the test extension :
cl_info
cl_scanfile
cl_engine
cl_pretcode
cl_version
cl_debug
ClamAV version 0.98.7 with 4078886 virus signatures loadedcl_info() return : 
cl_version() return : 0.98.7
cl_pretcode(CL_CLEAN) return : virus not found
cl_pretcode(CL_VIRUS) return : virus found
Execution time : 6.89 seconds
File path : /tmp/testvirus.txt
Return code : virus found
Virus found name : Eicar-Test-Signature

La commande phpinfo() doit également afficher une entrée pour clamav.

Tester un fichier dans un programme php

Voici un exemple de code, réalisé à partir de la documentation de php-clamav :

$virus = false;
if (extension_loaded ( 'clamav' )) {
$retcode = cl_scanfile ( $file ["tmp_name"], $virusname );
if ($retcode == CL_VIRUS) {
$virus = true;
$texte_erreur = $file ["name"] . " : " . cl_pretcode ( $retcode ) . ". Virus found name : " . $virusname;
echo $texte_erreur;
}
}
if ($virus == false) {
/*
 * Suite du traitement
 */

Le programme fonctionnera, que le module clamav soit activé ou non.