Correção de vazamento de dados nas páginas de erro e nos logs

Três problemas de exposição, todos com o mesmo efeito: dado interno saindo
para quem não deveria ver.

1. Painel de debug do Rails na tela do usuário
   O servidor sobe com RAILS_ENV=development (docker-compose.yml), e
   development tinha `consider_all_requests_local = true`. A página
   "Action Controller: Exception caught" mostra parâmetros, SESSÃO
   (session_id, _csrf_token, id do usuário logado), cookies, IP do cliente,
   caminho do servidor e o trace inteiro — para qualquer pessoa que
   provocasse um erro. Agora o detalhe depende de ERROS_DETALHADOS=true,
   que só é ligado na máquina de desenvolvimento.

2. Senha e PIN em texto puro no log
   Não existia filter_parameter_logging.rb neste projeto: toda senha do
   login, PIN de motorista e token do WhatsApp iam para log/ em texto
   puro — e log vai junto em backup e em suporte. Era o pior dos três,
   porque é permanente e não aparece na tela de ninguém.

3. Páginas de erro do usuário final
   Sem public/500.html, desligar o painel deixaria tela em branco. Criadas
   500/404/422 em português, sem CSS externo (precisam funcionar com a
   aplicação fora do ar).

Também sai do versionamento a pasta Erros/, com 16 páginas de debug salvas
do navegador. Não há cookie de sessão assinado nelas — ninguém entra no
sistema com o que está ali — mas há session_id, token CSRF, id de usuário e
IPs, que não têm por que estar no repositório.

Correção estrutural pendente: subir o servidor com RAILS_ENV=production
(production.rb já tem consider_all_requests_local=false e force_ssl=true).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-26 17:44:58 -03:00
parent 5bb5d74e22
commit ed44d5fd85
22 changed files with 127 additions and 55099 deletions

View File

@@ -0,0 +1,19 @@
# config/initializers/filter_parameter_logging.rb
#
# ⚠️ SEGURANÇA — sem esta lista, TODO parâmetro entra no log em texto puro:
# senha digitada no login, PIN do motorista, token de acesso do WhatsApp, cookie
# de sessão. O arquivo de log é lido por quem tem acesso ao servidor e costuma
# ser copiado junto em backup e em suporte.
#
# Os nomes são casados por SUBSTRING (`:senha` filtra `senha_confirmation`), e a
# lista é em português e inglês porque o projeto tem os dois (Devise usa
# `password`, o resto do sistema usa `senha`/`pin`).
Rails.application.config.filter_parameters += %i[
passw password password_confirmation
senha senha_confirmation
pin pin_code pin_acesso
secret token _key crypt salt certificate otp ssn
authorization cookie session
auth_token access_token api_key
whatsapp_token twilio_auth_token smtp_senha smtp_password
]