[HOW-TO/TUTORIAL] Virenscanner mit PHP

R

rico2009

Guest
Immer wenn man einen Dateiupload für die Öffentlichkeit baut, kommt man früher oder später (ehr früher) nicht drum rum einen Virenscanner einzubauen.

Für PHP gibt es z.B. das Modul "clamav" (Clam AntiVirus), womit man dies recht einfach realisieren kann:
PHP:
// @return true=Virus gefunden, false=Kein Virus gefunden
	public function virusCheck($filenameTmp, $filename) {
                // Ist das Modul installiert und aktiv
		if (!extension_loaded("clamav")) {
			error_log("Datei '".$filename." (".$filenameTmp.")' kann nicht überprüft werden, da das Modul 'php-clamavlib' nicht gefunden/installiert wurde!");
			return false;
		}

		$virusCode = cl_scanfile($filenameTmp, $virusname);
		if ($virusCode == CL_VIRUS) {
			echo "Datei '".$filename."' ist infiziert! Aus Sicherheitsgründen wird diese Datei nicht hochgeladen, für weitere Informationen wenden Sie sich bitte an den Administrator.";
			error_log("Virus '".$virusname."' in Datei '".$filename." (".$filenameTmp.")' gefunden! (ClamAV Version ".cl_version().")");

			return true;
		} else {
			return false;
		}
	}

Die Methode "virusCheck" kann man dann vor dem Upload in einem If-Statement aufrufen:
PHP:
if (!self::virusCheck($files["tmp_name"][$i],$files["name"][$i])) {
  // Kein Virus da, Datei hochladen
  // ...
}

Die ClamAV Extension für PHP kann man sich z.B. hier runterladen: https://launchpad.net/php-clamav
Kleine Doku der Funktionen: http://php-clamav.sourceforge.net/index.php
 
Zuletzt bearbeitet:
Das läuft dann so, dass die IP des hochladenden Clients gesperrt und die verseuchte Datei gelöscht wird. Der Hostingkunde muss dann die IP durch ein Ticket wieder freigeben lassen. Finde ich eigentlich ganz nett, so braucht sich der Hostingkunde darum nicht auch noch kümmern.
 
Finde ich eigentlich ganz nett, so braucht sich der Hostingkunde darum nicht auch noch kümmern.
Ja, auf jeden Fall.

Mein Script ist auch mehr für Betreiber eines eigenen Servers gedacht. Ich hatte das für ein eigenes Projekt mal recherchiert und fand die Lösung über clamav ziemlich einfach. Eventuell können es ja noch mehr gebrauchen.
 
Hm... mir gefällt der Ansatz nicht, dass die Datei nur beim Hochladen geprüft wird... wenn ich also einen neuen Virus habe, kann ich den bei dir hochladen und dann bleibt der dort auch.

Man sollte also auch bei eigens betriebenen Servern einen zentralen AV laufen haben, der alle Verzeichnisse in regelmäßigen Intervallen überprüft.

PS: ich verstehe den Sinn deiner Wrapperfunktion nicht so ganz...
Code:
if (cl_scanfile($filenameTmp, $virusname) !== CL_VIRUS){}
macht doch fast das Gleiche.
Wenn das Modul nicht arbeitet, ist sowieso irgendetwas in dem Server nicht in Ordunung und der Nutzer sollte das merken. Statt dessen wird die Datei kommentarlos hochgeladen.
Und wenn es ein Virus ist, kann ich im else immer noch eine Ausgabe machen... dann aber unter meiner Kontrolle mit der Ausgabe an der richtigen Stelle im Template.
PPS: wie in JS sollte man in PHP auch immer === und !== verwenden...
 
wenn ich also einen neuen Virus habe, kann ich den bei dir hochladen und dann bleibt der dort auch.
Nö, die Datenbank des AntiViren Moduls wird doch in regelmäßigen Abständen aktualisiert.

[...]
Wenn das Modul nicht arbeitet, ist sowieso irgendetwas in dem Server nicht in Ordunung und der Nutzer sollte das merken. Statt dessen wird die Datei kommentarlos hochgeladen.
[...]
Wenn das Modul nicht arbeitet bzw. nicht installiert ist, wird die Datei nicht überprüft aber hochgeladen. Dieses Modul ist sozusagen ein nettes Feature. Ich kann nicht erwarten, dass jeder der meine Software käuft auch gleich clamav installiert. Das bleibt jedem selber überlassen. Aber du hast Recht, wenn das Modul nicht arbeitet sollte dieser Fehler separat behandelt werden und die Datei sollte nicht hochgeladen werden. Das hatte ich bei der Umsetzung ganz vergessen.


PPS: wie in JS sollte man in PHP auch immer === und !== verwenden...
Hmm... Das ist aber ein Typ Vergleich. Sowas benutzt man nur, wenn man es braucht. Oder meintest du mit 'immer' immer dann wenns benötigt wird?
 
Nachtrag:
Auf dem Server läuft natürlich zwangsweise noch ein zentraler AV. Das bringt die Installation von clamav mit, ansonsten funktioniert das PHP-Modul auch nicht.
 
Nö, die Datenbank des AntiViren Moduls wird doch in regelmäßigen Abständen aktualisiert.
Aber die Datei wird nur beim Hochladen überprüft...

Hmm... Das ist aber ein Typ Vergleich. Sowas benutzt man nur, wenn man es braucht. Oder meintest du mit 'immer' immer dann wenns benötigt wird?
Mit "immer" meine ich "immer". Ansonsten hast du da immer einen Autocast dazwischen, der, wie bei JS auch, seltsame Dinge bewirken kann.

Deswegen steht das auch immer wieder in der PHP Doku. Z.B. hier: PHP: readdir - Manual

Außerdem ist es schneller...
 
Aber die Datei wird nur beim Hochladen überprüft...
Achso. Wenn du einen neuen Virus hast der noch nicht in der DB vorhanden ist, kannst du den hochladen, stimmt. Sicherheitsleck, hast Recht. Aber wie gesagt, ein zentraler AV läuft auch.


Mit "immer" meine ich "immer". Ansonsten hast du da immer einen Autocast dazwischen, der, wie bei JS auch, seltsame Dinge bewirken kann.

Deswegen steht das auch immer wieder in der PHP Doku. Z.B. hier: PHP: readdir - Manual

Außerdem ist es schneller...
Ah, gut zu wissen. Dann war mein Wissensstand noch ein wenig älter...
 
Er kann keinen Uploadordner prüfen, da es keinen gibt. Die Dateien werden (was mich betrifft) in einer DB gespeichert.

Um die Dateien dort regelmäßig zu prüfen müsste ich vermutlich einen Job bauen, der die Datei ausließt und durch den Scanner schickt.
 
Zurück
Oben