Sécurité des fichiers · 4 min read · Dec 07, 2025

Comment scanner automatiquement les fichiers téléchargés à la recherche de virus avec php-clamavlib - Page 2

5 Un petit exemple

Nous allons maintenant créer un petit script de téléchargement, /var/www/upload.php, qui contient un formulaire HTML de téléchargement. Si vous soumettez le formulaire, le script s’appellera lui-même et utilisera cl_info(), cl_scanfile(), cl_setlimits() et clam_get_version() pour scanner le fichier téléchargé à la recherche de virus. Si le fichier est correct, il sera téléchargé dans /var/www/uploads, sinon le script affichera un message d’erreur (indiquant quel virus/ver etc. il a trouvé) et supprimera le fichier sur le serveur.

Tout d’abord, nous devons créer le répertoire /var/www/uploads et le rendre accessible en écriture par notre utilisateur Apache, www-data :

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

Ensuite, nous créons le fichier /var/www/upload.php :

vi /var/www/upload.php

| Version de ClamAV : '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> Téléchargement de fichier

Téléchargement de fichier
Erreur :
Le fichier a été téléchargé avec succès dans !
Fichier :
|

Il contient le formulaire pour télécharger un fichier :

| [...]

Téléchargement de fichier
Erreur :
Le fichier a été téléchargé avec succès dans !
Fichier :
[...]
|

Après avoir sélectionné un fichier et cliqué sur le bouton Soumettre, le script s’appellera lui-même ( action=”upload.php”) et exécutera le code PHP en haut :

| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= 'Veuillez sélectionner un fichier à télécharger !'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'Nous avons un Malware : '.$malware.'
Version de ClamAV : '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
|

Les détails concernant le fichier téléchargé sont enregistrés dans le tableau $_FILES, donc nous l’utilisons pour vérifier le fichier (vous pouvez décommenter la ligne print_r($_FILES); pour voir ce qui est stocké dans le tableau).

J’utilise la fonction cl_setlimits() pour définir des limites pour le processus de scan de virus afin de prévenir les attaques DOS (où le processus de scan de virus pourrait consommer toutes les ressources du système). L’utilisation est comme suit :

cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) 
  • $maxreclevel : valeur entière / niveau maximal de récursion /
  • $maxfiles : valeur entière / nombre maximal de fichiers à scanner dans l’archive /
  • $maxratio : valeur entière / ratio de compression maximal /
  • $archivememlim : booléen / limiter l’utilisation de la mémoire pour bzip2 (0/1) /
  • $maxfilesize : entier long / les fichiers archivés plus grands que cette valeur (en octets) ne seront pas scannés /

Fondamentalement, ces valeurs définissent le comportement de ClamAV si des archives (fichiers zip, tar.gz, fichiers bz2, etc.) sont scannées. Si vous n’utilisez pas la fonction cl_setlimits(), les valeurs respectives du php.ini sont prises.

La fonction principale est la fonction cl_scanfile() qui prend le chemin du fichier à scanner comme argument. Les fichiers téléchargés sont temporairement enregistrés (généralement dans /tmp ; dépend de vos paramètres php.ini) avant d’être traités. Ce fichier temporaire est enregistré dans $_FILES[‘file’][‘tmp_name’] donc nous passons cette variable à la fonction cl_scanfile(). Si aucun virus n’est trouvé, elle renvoie FALSE, sinon le nom du virus trouvé.

clam_get_version() ne prend aucun argument. Cette fonction renvoie la version de ClamAV installé (comme 0.88.4).

Enfin, j’utilise la fonction cl_info() qui - comme clam_get_version() - ne prend aucun argument. Elle affiche des informations plus détaillées sur ClamAV, par exemple la version de ClamAV 0.88.4 avec 85917 signatures de virus chargées.

Maintenant, testons. Tapez http://192.168.0.100/upload.php dans votre navigateur. Vous devriez voir ceci :

Cliquez sur Parcourir… et sélectionnez un fichier à télécharger depuis votre disque dur (un fichier qui n’est pas un virus et ne dépasse pas 2 Mo - c’est la taille maximale de téléchargement par défaut qui peut encore être modifiée dans votre php.ini) :

Le téléchargement devrait réussir, et vous devriez voir quelque chose comme ceci :

Maintenant, nous devons obtenir un virus pour tester. Heureusement, il y a le virus de test Eicar, c’est un fichier qui ne cause aucun dommage, mais sa signature a été incluse dans tous les scanners de virus afin que vous puissiez tester si votre scanner de virus fonctionne en utilisant ce virus de test. Allez sur http://www.eicar.org/anti_virus_test_file.htm et téléchargez les fichiers eicar.com, eicar_com.zip et eicarcom2.zip sur votre disque dur. Ensuite, testez le téléchargement avec chacun d’eux :

Si tout se passe bien, php-clamavlib devrait reconnaître le virus et refuser le téléchargement :

6 Liens

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.