Boas práticas no desenvolvimento de serviços de upload e download de arquivos
· 3 min read
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
- https://blog.xapihub.io/2023/12/22/Handling-File-Uploads-in-RESTful-APIs.html
- https://tyk.io/blog/api-design-guidance-file-upload/
- https://climbtheladder.com/10-rest-api-file-upload-best-practices/
- https://www.reddit.com/r/softwarearchitecture/comments/10v7mo2/how_to_upload_large_files_1gb_through_a_restapi/
- https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
- https://www.opswat.com/blog/file-upload-protection-best-practices