Skip to content
mobius1qwe edited this page Nov 12, 2026 · 1 revision

Home > Segurança para produção > Antivírus em uploads 🚧

Antivírus em uploads (ClamAV)

Important

Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.

Vale para a 2.0 · Nível: intermediário

Em uma frase: o TRALUploadScanPlugin passa cada arquivo enviado por um scanner (TRALClamAVScanner, que fala com o clamd) antes de qualquer rota rodar; nada do arquivo é gravado.

Você vai precisar: RALModuleWebPackage (requer RALNetPackage) e um clamd acessível por TCP.

Subindo o clamd

sudo apt install clamav-daemon
# /etc/clamav/clamd.conf:
TCPSocket 3310
TCPAddr 127.0.0.1
sudo systemctl restart clamav-daemon

Teste: um arquivo de texto com a cadeia EICAR (a assinatura de teste padrão, publicada em eicar.org) deve ser recusado. Não exponha a porta 3310 fora da máquina/rede interna.

Ligando

uses RALUploadScan, RALClamAV;

Clam := TRALClamAVScanner.Create(Self);
Clam.Host := '127.0.0.1';
if not Clam.Ping then raise Exception.Create('clamd fora do ar');

Scan := TRALUploadScanPlugin.Create(Self);
Scan.Server := Servidor;
Scan.Scanner := Clam;
Scan.ScanFailAction := sfaReject;
Scan.OnScanUpload := {$IFDEF FPC}@{$ENDIF}ConferirUpload;

procedure TForm1.ConferirUpload(Sender: TObject; ARequest: TRALRequest;
  AParam: TRALParam; var AVerdict: TRALUploadVerdict; var AThreat: StringRAL);
begin
  // opcional: segunda opinião, ou mudar o veredito
end;

Propriedades

propriedade padrão
Scanner nil quem examina; nil deixa a decisão ao OnScanUpload
OnScanUpload por arquivo, depois do scanner; pode trocar AVerdict
ScanFailAction sfaReject arquivo que não pôde ser examinado: sfaReject responde 503 com Retry-After: 30; sfaAccept deixa passar
ScanBody False examina também o corpo inteiro cru (um PUT de arquivo)
TRALClamAVScanner.Host / Port — / 3310 endereço do clamd
Timeout 30000 ms para conectar e a cada etapa
ChunkSize 65536 bytes por pedaço do INSTREAM

Métodos do scanner: Ping (True se o clamd responde PONG) e Version. Vereditos: uvClean, uvInfected (422), uvError (ver ScanFailAction). Prioridade 450, fase ppProcess: depois da autenticação, então pedido recusado nem é examinado.

Armadilhas

o que acontece causa o que fazer
503 em todo upload clamd parado ou porta errada Ping; ou sfaAccept se aceita o risco
arquivo grande recusado pelo clamd StreamMaxLength do clamd.conf aumente lá
PUT cru passa sem exame ScanBody desligado ligue
conexão recusada TCPSocket não configurado veja acima

Scanners próprios herdam de TRALUploadScanner (método Scan, thread-safe).

Veja também

Começar

Servidor

MQTT 🚧

Cliente

Motores

Avançado

Ajuda

🚧 = em desenvolvimento, pode mudar

Clone this wiki locally