Por framework
Segurança do Laravel — exposição de .env, APP_DEBUG e autorização
As três grandes armadilhas de segurança do Laravel — .env exposto a partir do diretório público, APP_DEBUG ligado em produção e autorização ausente (IDOR / Mass Assignment) — e como fechar cada uma. Defensivo, sem passos de ataque.
Para: qualquer pessoa que opere um app Laravel. Sem passos de ataque aqui — só os três grandes incidentes operacionais e como fechá-los. Para o panorama completo, veja o hub de segurança por framework.
As três grandes armadilhas (onde os padrões não te salvam)
O escapamento e a autenticação do Laravel são excelentes, mas estas três são suas para fechar.
① Segredos expostos
.env, backups ou chaves acessíveis por URL a partir de public/. Um deslize de posicionamento = vazamento instantâneo.
② Debug ligado em produção
APP_DEBUG=true expõe variáveis de ambiente e informações de conexão na página de erro. Extraídas via erros deliberados.
③ Autorização ausente
Autenticado, mas sem escopo de proprietário (IDOR) / Mass Assignment sobrescrevendo is_admin, etc.
Como fechá-las (3 passos)
Mova segredos para fora do diretório público (permissão 600)
.env fora da raiz do documento, mas não deixe cair backups, exports ou arquivos de chave em public/ por acidente. Mantenha segredos fora da raiz do app com permissão 600 (só do proprietário). (→ mantenha segredos fora dos diretórios públicos · um caso completo de exposição de .env)Desative o debug + cacheie a config em produção
APP_DEBUG=false e APP_ENV=production. Fixe isso com um cache de config e impeça que erros detalhados apareçam externamente. Embuta nos passos de deploy e verifique toda vez.Construa a autorização (Policy/Gate + $fillable)
$fillable para evitar que campos não intencionais sejam sobrescritos. (→ o que é IDOR)Comum (perigoso)
- backups ou chaves colocados em
public/, acessíveis por URL - produção deixada em
APP_DEBUG=true - sem autorização — "logado = pode ver"
Model::create($request->all())aceitando todos os campos
Correto
- segredos fora da raiz do documento com permissão 600
- produção com debug desligado + cache de config
- escopo de proprietário com Policy/Gate
- declarar
$fillablepara bloquear o Mass Assignment
A visão deste site: sólido até os padrões; a autorização é sua responsabilidade
O Laravel tem muitos bons padrões, mas a autorização — quem pode fazer o quê — é específica do app, então nenhum framework consegue protegê-la automaticamente. Os incidentes que continuamos vendo são menos SQLi ou XSS do que o tipo "autenticado, mas sem verificação de propriedade". Então o centro de gravidade não é configuração chamativa, mas o trabalho sem glamour de dar escopo a cada leitura/atualização por proprietário. Some a isso manter segredos fora da superfície pública e desligar o debug em produção, e você previne a maioria dos incidentes reais do Laravel com essas três.
Leia a seguir
- Hub: segurança por framework · segurança do WordPress
- Segredos: mantenha segredos fora dos diretórios públicos · Caso: uma exposição completa de .env
- Autorização: o que é IDOR · Prática: o manual de resposta a vulnerabilidades
FAQ
QO Laravel é um framework seguro?
O Laravel entrega muitos padrões seguros (escapamento, autenticação) e é razoavelmente sólido de saída. Mas 'padrões seguros' e 'operação segura' são coisas diferentes, e os incidentes reais não vêm do núcleo, mas da configuração e da operação. .env/segredos expostos, debug deixado ligado em produção e autorização rasa são áreas que o framework não cobre por você. Você não pode confiar só nos padrões — precisa fechar essas três por conta própria.
QO que é perigoso em publicar com APP_DEBUG=true?
Com o debug ligado, uma página de erro pode mostrar não só um stack trace, mas segredos internos como variáveis de ambiente e informações de conexão. Um atacante pode provocar erros de propósito para extraí-los. Em produção, sempre defina APP_DEBUG=false e cacheie a configuração (config cache) para fixar isso, e impeça que erros detalhados sejam mostrados externamente.
QPor que 'se você está logado, pode ver' é perigoso?
Isso é autenticação sem autorização. Mesmo logado, se os dados não têm escopo por usuário (por user_id, etc.), trocar o ID na URL pode revelar os dados de outra pessoa (IDOR). No Laravel, implemente verificações de propriedade com Policy/Gate e declare $fillable para o Mass Assignment, evitando que campos não intencionais sejam sobrescritos.