Vibecoding
Como permitir upload de arquivo no seu app com segurança
Upload é a porta dos fundos favorita de invasor. Aprenda a deixar o usuário enviar arquivo sem abrir o seu app.
Upload parece a feature mais boba do mundo. Um botão, escolhe o arquivo, envia.
É uma das mais perigosas.
Upload aberto é convite pra três problemas: arquivo malicioso, Storage lotado e conta estourada. Vou te mostrar como fechar cada porta.
Por que upload é perigoso
Quando você deixa alguém subir um arquivo, você está deixando um estranho gravar dados no seu servidor. Sem regras, ele pode:
Subir um arquivo executável disfarçado
Subir milhares de arquivos gigantes e estourar seu custo
Sobrescrever arquivos de outros usuários
A IA gera o botão de upload em segundos. Ela raramente gera as travas. Você coloca.
Passo 1: defina o que é permitido antes de codar
Responda três perguntas:
Quais tipos de arquivo? (só imagem? só PDF?)
Qual tamanho máximo? (2 MB? 10 MB?)
Quem pode subir? (qualquer visitante ou só logado?)
Sem essas três respostas, você não tem como blindar. Tem como só liberar.
Passo 2: peça o upload com as travas no prompt
Você é dev full-stack. Implemente upload de imagem para o Firebase Storage.
Aceite apenas arquivos JPG e PNG.
Rejeite arquivos maiores que 5 MB.
Só permita upload de usuário autenticado.
Mostre erro claro se o arquivo for inválido.
Repare: as regras estão no pedido. Se você pedir só "faça upload", vem o botão sem trava.
Passo 3: valide no navegador (pra experiência)
A validação no navegador é pra dar feedback rápido. O usuário escolhe um arquivo errado e vê o erro na hora, sem esperar o envio.
Verifique a extensão e o tamanho antes de enviar.
Mostre "só JPG ou PNG, até 5 MB" se estiver errado.
Mas atenção: isso é conforto, não segurança. Validação no navegador se burla com dois cliques. Ela não protege nada sozinha.
Passo 4: feche o Storage nas regras (a segurança real)
Aqui está a trava que importa. As regras do Firebase Storage decidem quem sobe o quê, e elas rodam no servidor. Ninguém burla.
allow write: if request.auth != null
&& request.resource.size < 5 * 1024 * 1024
&& request.resource.contentType.matches('image/.*');
Traduzindo: só sobe quem está logado, arquivo menor que 5 MB, e só se for imagem. Essa regra é a diferença entre um app e um problema.
Passo 5: teste tentando quebrar
Vire o invasor por cinco minutos:
Tente subir um PDF onde só devia entrar imagem. Foi barrado?
Tente subir um arquivo de 50 MB. Foi barrado?
Tente subir sem estar logado. Foi barrado?
Se qualquer um passou, sua regra tem furo. Conserte antes de subir.
O custo de não fazer
Storage aberto não é só risco de segurança. É risco financeiro. Alguém pode automatizar upload e encher seu bucket em uma noite. Você acorda com uma conta absurda.
Segundo a Veracode, código de IA tem 2,74 vezes mais falhas de segurança. Upload sem validação é uma delas, e das mais caras.
Upload seguro não é difícil. É só não pular a etapa das regras. Vibecoding com engenharia é lembrar que todo campo onde o usuário envia dado é uma porta. E porta boa tem fechadura.
A decisão é sua.
Fontes
Veracode, State of Software Security 2025.
Perguntas frequentes
Perguntas rápidas
+Qual o maior risco de um upload aberto?
Dois: alguém subir arquivo malicioso e alguém encher seu Storage de lixo, estourando seu custo. Ambos evitáveis com regras.
+Preciso validar o arquivo no navegador ou no servidor?
Nos dois. No navegador pra experiência, no servidor ou nas regras pra segurança. Validação só no navegador é fácil de burlar.
+Posso deixar qualquer tipo de arquivo?
Não. Aceite só os tipos que seu app usa de verdade. Uma foto de perfil não precisa aceitar arquivo executável.
Continue lendo
Como não virar refém de uma ferramenta de IA
A ferramenta que você ama hoje pode dobrar de preço, mudar de dono ou fechar amanhã. Não construa em cima de uma só.
VibecodingO que fazer quando a IA te dá código que você não entende
A tentação é apertar aceitar e seguir. Não faça. Código que você não entende é código que você não mantém.
VibecodingPor que backup não é opcional
Existe quem faz backup e quem ainda não perdeu tudo. Você escolhe de qual lado ficar antes ou depois.