Programação · 4 min read · Dec 07, 2025
Como Escanear Automaticamente Arquivos Enviados em Busca de Vírus Com php-clamavlib - Página 2
5 Um Pequeno Exemplo
Agora vamos criar um pequeno script de upload, /var/www/upload.php, que contém um formulário HTML de upload. Se você enviar o formulário, o script chamará a si mesmo e usará cl_info(), cl_scanfile(), cl_setlimits() e clam_get_version() para escanear o arquivo enviado em busca de vírus. Se o arquivo estiver ok, ele será enviado para /var/www/uploads, caso contrário, o script exibirá uma mensagem de erro (informando qual vírus/verme etc. foi encontrado) e excluirá o arquivo no servidor.
Primeiro, devemos criar o diretório /var/www/uploads e torná-lo gravável pelo nosso usuário Apache, www-data:
mkdir /var/www/uploads
chown www-data:www-data /var/www/uploads
Em seguida, criamos o arquivo /var/www/upload.php:
vi /var/www/upload.php| Versão do ClamAV: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } ?> |
Contém o formulário para enviar um arquivo:
| [...] [...] |
Depois de selecionar um arquivo e clicar no botão Enviar, o script chamará a si mesmo ( action=”upload.php”) e executará o código PHP no topo:
| [...] if($_POST){ $error = ''; //print_r($_FILES); if($_FILES['file']['size'] == 0 || !is_file($_FILES['file']['tmp_name'])){ $error .= 'Por favor, selecione um arquivo para upload!'; } else { cl_setlimits(5, 1000, 200, 0, 10485760); if($malware = cl_scanfile($_FILES['file']['tmp_name'])) $error .= 'Temos Malware: '.$malware.' |
Versão do ClamAV: '.clam_get_version(); } if($error == ''){ rename($_FILES['file']['tmp_name'], $upload_dir.$_FILES['file']['name']); } } [...]
Os detalhes sobre o arquivo enviado são salvos no array $_FILES, então usamos isso para verificar o arquivo (você pode descomentar a linha print_r($_FILES); para ver o que está armazenado no array).
Eu uso a função cl_setlimits() para definir limites para o processo de escaneamento de vírus a fim de prevenir ataques DOS (onde o processo de escaneamento de vírus poderia consumir todos os recursos do sistema). O uso é assim:
cl_setlimits($maxreclevel, $maxfiles, $maxratio, $archivememlim, $maxfilesize) - $maxreclevel: valor inteiro / nível máximo de recursão /
- $maxfiles: valor inteiro / número máximo de arquivos a serem escaneados dentro do arquivo /
- $maxratio: valor inteiro / razão máxima de compressão /
- $archivememlim: booleano / limitar o uso de memória para bzip2 (0/1) /
- $maxfilesize: inteiro longo / arquivos arquivados maiores que este valor (em bytes) não serão escaneados /
Basicamente, esses valores definem o comportamento do ClamAV se arquivos arquivados (arquivos zip, tar.gz, arquivos bz2, etc.) forem escaneados. Se você não usar a função cl_setlimits(), os respectivos valores do php.ini serão utilizados.
A função principal é a função cl_scanfile() que recebe o caminho do arquivo a ser escaneado como argumento. Os arquivos enviados são temporariamente salvos (geralmente em /tmp; depende das configurações do seu php.ini) antes de serem processados. Esse arquivo temporário é salvo em $_FILES[‘file’][‘tmp_name’] então passamos essa variável para a função cl_scanfile(). Se nenhum vírus for encontrado, ela retorna FALSE, caso contrário, o nome do vírus encontrado.
clam_get_version() não recebe nenhum argumento. Essa função retorna a versão do ClamAV instalado (como 0.88.4).
Finalmente, eu uso a função cl_info() que - assim como clam_get_version() - não recebe nenhum argumento. Ela exibe informações mais detalhadas sobre o ClamAV, por exemplo, versão do ClamAV 0.88.4 com 85917 assinaturas de vírus carregadas.
Agora vamos testar. Digite http://192.168.0.100/upload.php no seu navegador. Você deve ver isso:

Clique em Procurar… e selecione um arquivo para enviar do seu disco rígido (um arquivo que não seja vírus e não maior que 2MB - esse é o tamanho máximo de upload padrão que pode ser alterado no seu php.ini):

O upload deve ser bem-sucedido, e você deve ver algo como isto:

Agora precisamos obter um vírus para testar. Felizmente, existe o vírus de teste Eicar, é um arquivo que não faz nenhum dano, mas sua assinatura foi incluída em todos os scanners de vírus para que você possa testar se seu scanner de vírus está funcionando usando esse vírus de teste. Vá para http://www.eicar.org/anti_virus_test_file.htm e baixe os arquivos eicar.com, eicar_com.zip e eicarcom2.zip para o seu disco rígido. Em seguida, teste o upload com cada um deles:

Se tudo correr bem, php-clamavlib deve reconhecer o vírus e recusar o upload:

6 Links
- 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
- Vírus de Teste Eicar: http://www.eicar.org/anti_virus_test_file.htm
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.