Skip to main content

Boas práticas no desenvolvimento de serviços de upload e download de arquivos

· 3 min read
Leandro Andrade
Leandro Andrade
Software Developer

Ao desenvolver um serviço para realizar upload e download de arquivos, uma série de boas práticas precisam ser seguidas a fim de ter um serviço resiliente, seguro e confiável, já que deixar o upload de arquivos irrestrito cria um vetor de ataque para atores mal-intencionados.

Alguns conceitos básico de REST API para upload de arquivos:

  • métodos http mais usados são PUT e POST;
  • content-type multipart/form-data. Usando quando queremos upload de múltiplos arquivos ou suporte a metadados associados na mesma requisição;
  • adicionar o header Content-Length para ajudar o server no upload;

Segurança

  • validar nome e metadados do arquivo restringindo caracteres e tamanho;
  • validar os tipos de arquivos permitidos;
  • validar a extensão/tipo do arquivo, basear no tipo verdadeiro do arquivo (.exe -> .pdf);
  • validar o mimetype ou content-type;
  • utilizar https e evitar http;
  • adicionar rate limit para previnir abuso no uso, no upload e download;
  • usar nomes únicos aleatórios nos arquivos (UUID, cuidv2);
  • nomear os arquivo para facilitar a identificação;
  • evitar caracteres especiais no nome do arquivo (slugify);
  • incluir timestamp no nome do arquivo;
  • checar o tipo de arquivo e conteúdo antes de salvar, evitar ameaças ocultas removendo objetos embedded com a metodologia content disarm and reconstruction (CDR);
  • testar upload com vários tipos de arquivos;
  • limitar quem pode fazer upload com autenticação e autorização;
  • usar mensagens de erro genéricas, sem muitos detalhes internos;

Limite de tamanho

  • definir um limite no tamanho do arquivo para upload;
  • definir um limite no tamanho do nome do arquivo;
  • utilizar stream para transmitir os arquivos, não carregar todo na memória;
  • considerando o tamanho do arquivo em relação à capacidade do servidor;

Performance

  • usar fila para gerenciar o upload de arquivo em cenários com alta concorrência;
  • para envio de arquivos muito grande, considerar usar chunks;
  • realizar uploads concorrentes;

Storage

  • pode ser usado local, cloud ou híbrido;
  • criar uma estrutura semântica lógica dos diretórios/arquivos para fácil categorização;
  • usar subdiretórios para evitar confusão;
  • validar o conteudo do arquivo, principalmente arquivos .zip: revisão manual em um sandbox pode ser usada antes de disponibilizar o arquivo e, se possível, adicionar uma rotina automatizada para validar os arquivos;
  • checar por vulnerabilidades no diretórios dos arquivos enviados;
  • armazenamento dos arquivos:
    • amarazenar o arquivo em um host diferente do host da aplicação a fim de gerenciar a aplicação que atende o usuário da aplicaçao que gerencia os uploads;
    • armazenar o arquivo fora do web root;
    • apenas permissão de gravação no diretório;
    • caso leitura seja necessário, definir controles;
    • evitar armazenar arquivos em banco de dados;
    • caso a execução seja necessária, verificar o arquivo antes para garantir que não existe nenhuma macro;

Referências