Este projeto implementa um serviço de upload de arquivos com escaneamento de vírus integrado usando a CLI do Avast. A solução aborda o desafio de lidar com uploads de arquivos de forma segura, minimizando o risco de propagação de vírus. Os arquivos enviados são escaneados em busca de ameaças, com logs dos resultados armazenados em um banco de dados MySQL. Arquivos são aceitos por meio de um endpoint da API, e limites estritos de tamanho de arquivo são aplicados para garantir o processamento eficiente.
O principal desafio foi criar um sistema de upload de arquivos seguro e eficiente que:
- Garante que todos os arquivos enviados sejam escaneados em busca de vírus.
- Evita reescaneamentos desnecessários de arquivos duplicados.
- Fornece logs e rastreabilidade dos resultados dos escaneamentos para cada arquivo.
- Armazena metadados em um banco de dados relacional para fácil acompanhamento.
- Limita o tamanho do arquivo a 1MB para uso controlado de recursos.
A solução envolve:
- Tratamento de Upload de Arquivos: Usando o framework Fastify, a API aceita uploads de arquivos por meio de um endpoint dedicado.
- Escaneamento de Vírus: A CLI do Avast é utilizada para escanear os arquivos enviados em busca de potenciais ameaças.
- Registro de Resultados: Os resultados dos escaneamentos (por exemplo, limpo ou infectado) são salvos em um banco de dados MySQL usando o Prisma ORM.
- Armazenamento de Arquivos: Os arquivos são arquivados localmente no servidor com nomes únicos derivados de seus conteúdos.
- Tratamento de Erros e Tolerância a Falhas: O tratamento de erros abrangente garante uma operação contínua e registro detalhado de falhas.
- Fastify: Escolhido por seu desempenho e leveza, ideal para lidar com uploads de arquivos de forma eficiente.
- MySQL: Utilizado para armazenar metadados sobre arquivos enviados e resultados de escaneamentos, garantindo rastreabilidade e consultas fáceis.
- Prisma: Simplifica as interações com o banco de dados com um ORM intuitivo baseado em TypeScript.
- CLI do Avast: Executa o escaneamento antivírus localmente no servidor. Os resultados do escaneamento são analisados e armazenados para referência futura.
POST /upload
- Headers:
Content-Type: multipart/form-data
- Corpo:
file
(obrigatório): O arquivo a ser enviado. Tamanho máximo: 1MB.
- 200 OK (Arquivo enviado e escaneado com sucesso)
{ "message": "Arquivo enviado e escaneado com sucesso", "scanResult": "clean" }
- 400 Bad Request (Arquivo excede o limite de tamanho ou está ausente)
{ "error": "Tamanho do arquivo excede o limite ou nenhum arquivo foi enviado" }
- 500 Internal Server Error (Falha no escaneamento ou erro inesperado)
{ "error": "Erro interno do servidor" }
-
Clone o repositório:
git clone https://github.com/zeroskullx/secure-scan-uploader.git cd secure-scan-uploader
-
Instale as dependências:
npm install
-
Configure o ambiente: Crie um arquivo
.env
e defina as seguintes variáveis:PORT=3333 DATABASE_URL=mysql://user:password@localhost:3306/your_database FILE_UPLOAD_DIR=/path/to/upload/directory AVAST_CLI_PATH=/path/to/avast
-
Execute as migrações do banco de dados:
npx prisma migrate dev
-
Inicie o servidor:
npm run dev:watch
- Upload de Arquivo: Os usuários enviam arquivos por meio do endpoint
/upload
. Arquivos que excedem o limite de 1MB são rejeitados. - Escaneamento de Vírus: O servidor invoca a CLI do Avast para escanear o arquivo enviado. Os resultados do escaneamento são registrados em um arquivo e armazenados no banco de dados.
- Arquivamento: Os arquivos são armazenados localmente com um nome único baseado no hash de seus conteúdos para evitar duplicatas.
- Registro no Banco de Dados: Metadados como nome do arquivo, resultado do escaneamento e timestamp do upload são armazenados no MySQL para referência.
curl -X POST -F "[email protected]" http://exemplo.com/upload
{
"message": "Arquivo enviado e escaneado com sucesso",
"scanResult": "clean"
}
- Suporte a Armazenamento em Nuvem: Integração com S3 ou Azure Blob Storage para armazenamento de arquivos.
- Escaneamento Distribuído: Utilização de APIs antivírus baseadas em nuvem para escalabilidade.
- Acompanhamento Avançado de Metadados: Armazenamento de atributos adicionais de arquivos, como ID do usuário ou tags de arquivo.
- Aprimoramentos de Escalabilidade: Introdução de limites de taxa e processamento distribuído para lidar com tráfego intenso.
Este projeto está licenciado sob a Licença MIT. Veja o arquivo LICENSE para mais detalhes.
Contribuições são bem-vindas! Abra uma issue ou envie um pull request para quaisquer melhorias ou correções de bugs.