Virus-Scan für Dateien mit PHP5 und ClamAV ------------------------------------------ PHP5 kann Dateien (z.B. nach Upload) mit ClamAV auf Viren prüfen. Leider hat das PHP5-Modul einen gravierenden Nachteil: Die gesamte Signaturen-Datenbank wird vorgeladen und belegt für jeden Webserver-Prozess Speicher. Das können je nach verwendeten Signaturen bis zu 24MB sein. Wenn man das mal auf 100 Prozesse multipliziert ist das der GAU für jeden Sysadmin. Aus diesem Grund habe ich mich entschieden, das Modul nicht immer in PHP5 zu aktivieren. Es besteht aber die Möglichkeit, Module dynamisch nachzuladen. Davon können Sie Gebrauch machen sofern dies benötigt wird. Im Folgenden sehen Sie eine kleine Anleitung zur Viren-Prüfung durch PHP5 und ClamAV mit dynamisch nachgeladenem Modul. 1. Das Modul "clamav.so" nachladen ---------------------------------- Die Funktion dl() wird verwendet, um PHP5-Module zur Laufzeit zu aktivieren. Nach Beendigung des Scripts werden die so geladenen Module automatisch wieder entfernt. Die folgende Funktion beinhaltet alle notwendigen Angaben, um das benötigte Modul einzubinden und zu konfigurieren. function load_clamav() { @dl('clamav.so'); # Modul dynamisch laden @ini_set('clamav.dbpath','/var/lib/clamav'); # Pfad zu Signaturen-Datei(en) @ini_set('clamav.scan_file_uploads','0'); # immer Uploads scannen (1=ja, 0=nein) @ini_set('clamav.maxfiles','100'); # max. Anzahl gescannter Dateien in Archiven @ini_set('clamav.maxfilesize','10240'); # max. Größe von gescannten Dateien (scannt nur die ersten x Byte) @ini_set('clamav.maxreclevel','3'); # max. Rekurions-Level in Archiven @ini_set('clamav.archivememlim','1'); # BZIP2 speicheroptimiert ausführen (1=ja, 0=nein) } Der einfachste Weg ist für Sie nun, die Funktion in Ihre PHP-Datei einzubinden und anschließend folgenden Aufruf zu starten: load_clamav(); Damit ist das Modul geladen und steht bereit. 2. Datei auf Virus prüfen ------------------------- Das folgende Code-Beispiel zeigt, wie eine Datei (hier "test.exe") auf Viren geprüft werden kann. $virus=cl_scanfile("test.exe"); # Datei auf Viren prüfen if($virus!=''){ echo 'Virus gefunden: '.$virus; } else { echo 'Kein Virus gefunden'; } Dies kann auch auf per Formular hochgeladene Dateien angewandt werden. Dazu müssen Sie nur statt dem Name (hier "test.exe") die Variable $_FILES['XXX']['tmp_name'] benutzen. Dabei ist zu beachten, dass XXX mit dem Name zu ersetzen ist, den Sie für das Feld benutzen. Zum Beispiel... In Ihrem Formular ist das Feld für die hochzuladene Datei so benannt: Dann muss die zum Virus-Scan verwendete Variable so lauten: $_FILES['dateiupload']['tmp_name'] 3. Mögliche Funktionen des Moduls --------------------------------- Die folgenden Funktionen werden durch das Modul "clamav.so" bereitgestellt. cl_info(); # liefert detailierte Informationen zur ClamAV Version und Signaturen-Datenbank cl_scanfile('dateiname'); # scannt eine Datei auf Viren und gibt ggf. den Virus-Name zurück cl_setlimits(); # Paramteter für Scanner setzen [$maxreclevel,$maxfiles,$maxratio,$archivememlim,$maxfilesize] cl_scanfile_ex(); # erweiterte Version von cl_scanfile(); mit Parametern: [$filename,$options,$virusname,$returncode] cl_pretcode(); # numerischen Return-Code auswerten / interpretieren clam_get_version(); # liefert lediglich die ClamAV Version clam_scan_file(); # siehe cl_scanfile(); --- So, das war's auch schon. Ich wünsche viel Erfolg und übernehme wie immer keinerlei Haftung für Schäden oder sonstige Umstände, die aus dem Gebrauch dieser Informationen entstehen könnten. Version 2009-10-13 Steffen Ille