Programación · 4 min read · Dec 07, 2025
Cómo escanear automáticamente archivos subidos en busca de virus con php-clamavlib - Página 2
5 Un pequeño ejemplo
Ahora crearemos un pequeño script de carga, /var/www/upload.php, que contiene un formulario HTML de carga. Si envías el formulario, el script se llamará a sí mismo y usará cl_info(), cl_scanfile(), cl_setlimits() y clam_get_version() para escanear el archivo subido en busca de virus. Si el archivo está bien, se cargará en /var/www/uploads; de lo contrario, el script mostrará un mensaje de error (indicando qué virus/gusano, etc. encontró) y eliminará el archivo en el servidor.
Primero, debemos crear el directorio /var/www/uploads y hacerlo escribible por nuestro usuario de Apache, www-data:
mkdir /var/www/uploads
chown www-data:www-data /var/www/uploads
Luego creamos el archivo /var/www/upload.php:
vi /var/www/upload.php| Versión de ClamAV: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> |
Contiene el formulario para cargar un archivo:
| [...] [...] |
Después de que hayas seleccionado un archivo y hayas hecho clic en el botón Enviar, el script se llamará a sí mismo ( action=”upload.php”) y ejecutará el código PHP en la parte superior:
| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= '¡Por favor selecciona un archivo para cargar!'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'Tenemos Malware: '.$malware.' |
Versión de ClamAV: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
Los detalles sobre el archivo subido se guardan en el array $_FILES, así que usamos eso para verificar el archivo (puedes descomentar la línea print_r($_FILES); para ver qué se almacena en el array).
Uso la función cl_setlimits() para establecer límites para el proceso de escaneo de virus con el fin de prevenir ataques DOS (donde el proceso de escaneo de virus podría consumir todos los recursos del sistema). El uso es así:
cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) - $maxreclevel: valor entero / nivel máximo de recursión /
- $maxfiles: valor entero / número máximo de archivos a escanear dentro del archivo /
- $maxratio: valor entero / relación de compresión máxima /
- $archivememlim: booleano / limitar el uso de memoria para bzip2 (0/1) /
- $maxfilesize: entero largo / archivos archivados más grandes que este valor (en bytes) no serán escaneados /
Básicamente, estos valores definen el comportamiento de ClamAV si se escanean archivos comprimidos (archivos zip, tar.gz, bz2, etc.). Si no usas la función cl_setlimits(), se toman los valores respectivos del php.ini.
La función principal es la función cl_scanfile() que toma la ruta al archivo a escanear como argumento. Los archivos subidos se guardan temporalmente (generalmente en /tmp; depende de la configuración de tu php.ini) antes de ser procesados. Ese archivo temporal se guarda en $_FILES[‘file’][‘tmp_name’] así que pasamos esa variable a la función cl_scanfile(). Si no se encuentra ningún virus, devuelve FALSE; de lo contrario, el nombre del virus que encontró.
clam_get_version() no toma ningún argumento. Esa función devuelve la versión de ClamAV instalado (como 0.88.4).
Finalmente, uso la función cl_info() que, al igual que clam_get_version(), no toma ningún argumento. Muestra información más detallada sobre ClamAV, por ejemplo, versión de ClamAV 0.88.4 con 85917 firmas de virus cargadas.
Ahora probemos. Escribe http://192.168.0.100/upload.php en tu navegador. Deberías ver esto:

Haz clic en Examinar… y selecciona un archivo para cargar desde tu disco duro (un archivo que no sea un virus y no más grande que 2MB - ese es el tamaño máximo de carga predeterminado que nuevamente puede cambiarse en tu php.ini):

La carga debería tener éxito, y deberías ver algo como esto:

Ahora necesitamos conseguir un virus para probar. Afortunadamente, existe el virus de prueba Eicar, es un archivo que no hace ningún daño, pero su firma se incluyó en todos los escáneres de virus para que puedas probar si tu escáner de virus está funcionando usando ese virus de prueba. Ve a http://www.eicar.org/anti_virus_test_file.htm y descarga los archivos eicar.com, eicar_com.zip y eicarcom2.zip a tu disco duro. Luego prueba la carga con cada uno de ellos:

Si todo va bien, php-clamavlib debería reconocer el virus y rechazar la carga:

6 Enlaces
- php-clamavlib: http://packages.debian.org/unstable/source/php-clamavlib
- PHP: http://www.php.net
- ClamAV: http://www.clamav.net
- Apache: http://httpd.apache.org
- Virus de Prueba Eicar: http://www.eicar.org/anti_virus_test_file.htm
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.