Programmierung · 4 min read · Dec 08, 2025

Wie man hochgeladene Dateien automatisch auf Viren mit php-clamavlib scannt - Seite 2

5 Ein kleines Beispiel

Wir werden jetzt ein kleines Upload-Skript erstellen, /var/www/upload.php, das ein HTML-Upload-Formular enthält. Wenn Sie das Formular absenden, wird das Skript sich selbst aufrufen und cl_info(), cl_scanfile(), cl_setlimits() und clam_get_version() verwenden, um die hochgeladene Datei auf Viren zu scannen. Wenn die Datei in Ordnung ist, wird sie nach /var/www/uploads hochgeladen, andernfalls zeigt das Skript eine Fehlermeldung an (die angibt, welchen Virus/Wurm usw. es gefunden hat) und löscht die Datei auf dem Server.

Zuerst müssen wir das Verzeichnis /var/www/uploads erstellen und es für unseren Apache-Benutzer, www-data, beschreibbar machen:

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

Dann erstellen wir die Datei /var/www/upload.php:

vi /var/www/upload.php

| ClamAV-Version: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> Datei-Upload

Datei-Upload
Fehler:
Datei wurde erfolgreich nach hochgeladen!
Datei:
|

Es enthält das Formular zum Hochladen einer Datei:

| [...]

Datei-Upload
Fehler:
Datei wurde erfolgreich nach hochgeladen!
Datei:
[...]
|

Nachdem Sie eine Datei ausgewählt und auf die Schaltfläche Absenden geklickt haben, wird das Skript sich selbst aufrufen ( action=”upload.php”) und den PHP-Code am Anfang ausführen:

| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= 'Bitte wählen Sie eine Datei zum Hochladen aus!'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'Wir haben Malware: '.$malware.'
ClamAV-Version: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
|

Details zur hochgeladenen Datei werden im $_FILES-Array gespeichert, sodass wir dieses verwenden, um die Datei zu überprüfen (Sie können die Zeile print_r($_FILES); auskommentieren, um zu sehen, was im Array gespeichert ist).

Ich verwende die Funktion cl_setlimits(), um Grenzen für den Virenscanprozess festzulegen, um DOS-Angriffe zu verhindern (bei denen der Virenscanprozess alle Ressourcen des Systems verbrauchen könnte). Die Verwendung ist wie folgt:

cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) 
  • $maxreclevel: ganzzahliger Wert / maximale Rekursionsebene /
  • $maxfiles: ganzzahliger Wert / maximale Anzahl von Dateien, die innerhalb des Archivs gescannt werden sollen /
  • $maxratio: ganzzahliger Wert / maximales Kompressionsverhältnis /
  • $archivememlim: boolean / begrenze den Speicherverbrauch für bzip2 (0/1) /
  • $maxfilesize: lange Ganzzahl / archivierte Dateien, die größer sind als dieser Wert (in Bytes), werden nicht gescannt /

Im Grunde definieren diese Werte das Verhalten von ClamAV, wenn Archive (Zip-Dateien, tar.gz-Dateien, bz2-Dateien usw.) gescannt werden. Wenn Sie die Funktion cl_setlimits() nicht verwenden, werden die entsprechenden Werte aus der php.ini übernommen.

Die Hauptfunktion ist die Funktion cl_scanfile(), die den Pfad zur zu scannenden Datei als Argument nimmt. Hochgeladene Dateien werden vor der Verarbeitung vorübergehend gespeichert (normalerweise in /tmp; hängt von Ihren php.ini-Einstellungen ab). Diese temporäre Datei wird in $_FILES[‘file’][‘tmp_name’] gespeichert, sodass wir diese Variable an die Funktion cl_scanfile() übergeben. Wenn kein Virus gefunden wird, gibt sie FALSE zurück, andernfalls den Namen des gefundenen Virus.

clam_get_version() benötigt kein Argument. Diese Funktion gibt die Version des installierten ClamAV zurück (wie 0.88.4).

Schließlich verwende ich die Funktion cl_info(), die - wie clam_get_version() - kein Argument benötigt. Sie zeigt detailliertere Informationen über ClamAV an, zum Beispiel ClamAV-Version 0.88.4 mit 85917 geladenen Virus-Signaturen.

Jetzt testen wir. Geben Sie http://192.168.0.100/upload.php in Ihren Browser ein. Sie sollten Folgendes sehen:

Klicken Sie auf Durchsuchen… und wählen Sie eine Datei von Ihrer Festplatte aus (eine Datei, die kein Virus ist und nicht größer als 2 MB ist - das ist die standardmäßige maximale Upload-Größe, die wiederum in Ihrer php.ini geändert werden kann):

Der Upload sollte erfolgreich sein, und Sie sollten etwas wie folgt sehen:

Jetzt müssen wir einen Virus bekommen, um zu testen. Glücklicherweise gibt es den Eicar-Testvirus, es ist eine Datei, die keinen Schaden anrichtet, aber deren Signatur in allen Virenscannern enthalten ist, damit Sie testen können, ob Ihr Virenscanner funktioniert, indem Sie diesen Testvirus verwenden. Gehen Sie zu http://www.eicar.org/anti_virus_test_file.htm und laden Sie die Dateien eicar.com, eicar_com.zip und eicarcom2.zip auf Ihre Festplatte herunter. Testen Sie dann den Upload mit jeder von ihnen:

Wenn alles gut geht, sollte php-clamavlib den Virus erkennen und den Upload verweigern:

6 Links

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.