Armazenamento de Arquivos

Buckets

Quando utilizamos serviços de armazenamento externos (e.g. Amazon S3) é recomendado tomarmos os seguintes cuidados:
  • operações de escrita devem requerer autenticação;
  • se possível, limitar por range de IP as redes que podem acessar (e.g. utilizando uma VPN);
  • a listagem de arquivos não pode ser pública;
  • ferramentas de gerenciamento visual devem ter acesso protegido por usuário e senha;
  • um bucket deve conter apenas arquivos de um determinado contexto (e.g. logs e backups apenas acessáveis por administradores).

Nomes dos arquivos

Quando gerar arquivos para download, devemos dar preferência para nomes que não sejam facilmente adivinhados, adicionando uma hash, por exemplo. Então ao invés de {userId}_fatura.pdf devemos usar {userId}_fatura_{hash}.pdf.
Em arquivos que tenha proteção por sessão, não devemos utilizar nenhum dado que identifique o titular do arquivo: fatura_dez_2020_[hash].pdf.

Arquivos temporários

Um tipo de arquivo temporário comum é aquele que o usuário realiza o upload e costumamos salvar em uma pasta para posteriormente enviar a um bucket. Nesses e outros arquivos temporários devemos tomar os seguintes cuidados:
  • A pasta onde os arquivos temporários são mantidos só pode ser acessada pela aplicação.
  • Ao final da execução do fluxo que lida com esse arquivo, independentemente de sucesso ou erro, o arquivo deve ser removido.
  • Caso o arquivo tenha informações pessoais/sensíveis, só pode ser acessado com controle de sessão. (Isso quer dizer que o proprietário das informações deve permitir.)

Upload de arquivos

Muitos ataques podem vir através do nome, caminho e tipo do arquivo. Para nos defendermos contra esses ataques devemos sempre:
  • Gerar outro nome para o arquivo ou sanitizar o existente.
  • Utilizar um validador de extensão. Para garantir que o arquivo é do tipo esperado e não um malicioso renomeado.