Visão Geral¶
Foi implementado um sistema de monitoramento de erros CSRF que captura e envia automaticamente informações detalhadas para o Sentry sempre que uma requisição falha na verificação CSRF.
Arquivos Modificados/Criados¶
1. src/integrador/views_errors.py (NOVO)¶
View customizada para tratar falhas de verificação CSRF.
Funcionalidades:
- Captura informações detalhadas da requisição que falhou
- Envia notificação para o Sentry com contexto completo
- Detecta automaticamente o tipo de resposta esperado (JSON ou HTML)
- Registra log local para debug
Detecção de tipo de resposta (em ordem de prioridade):
- Se
Content-Typeéapplication/json→ retorna JSON - Se header
Acceptcontémapplication/json→ retorna JSON - Se path começa com
/api/→ retorna JSON - Caso contrário → retorna HTML
Informações capturadas:
- Path e método da requisição
- User Agent do cliente
- Endereço IP remoto
- HTTP Referer
- Content Type
- Razão da falha CSRF
- Informações do usuário (se autenticado)
2. src/settings/securities.py (MODIFICADO)¶
Configuração atualizada para usar a view customizada:
3. src/integrador/templates/403_csrf.html (NOVO)¶
Template HTML personalizado para exibir erro CSRF de forma amigável. Segue o mesmo padrão visual dos templates 404.html e 500.html do projeto, mantendo consistência no design.
Como Funciona¶
Fluxo de Execução¶
- Requisição chega ao servidor → Django valida o token CSRF
- Validação falha → Django chama
CSRF_FAILURE_VIEW - View customizada é executada →
csrf_failure()emviews_errors.py - Captura de informações → Coleta dados da requisição
- Envio para Sentry → Registra no Sentry com tags e contexto
- Log local → Registra warning no log do Django
- Resposta ao cliente → Retorna JSON (APIs) ou HTML (navegadores)
Informações no Sentry¶
Cada erro CSRF enviado ao Sentry inclui:
Tags:
error_type: "csrf_failure"csrf_reason: <motivo específico>
Contextos:
- csrf_failure: path, method, referer, reason
- client: IP, user agent
- user: id, username, email (se autenticado)
Nível: warning
Testando a Implementação¶
1. Teste via cURL (Requisição sem token CSRF)¶
# Deve retornar JSON com status 403
curl -X POST http://localhost:8091/api/algum-endpoint/ \
-H "Content-Type: application/json" \
-d '{"test": "data"}'
2. Testar usando o container¶
3. Verificar no Sentry¶
- Acesse seu dashboard do Sentry
- Filtre por tag:
error_type:csrf_failure - Verifique os detalhes capturados
Configuração do Sentry¶
Certifique-se de que o Sentry está configurado corretamente em settings/observabilities.py:
Outras variáveis opcionais:
SENTRY_ENVIRONMENT: Define o ambiente (local, dev, prod)SENTRY_SAMPLE_RATE: Taxa de amostragem de erros (0-100)SENTRY_SEND_DEFAULT_PII: Envia informações pessoais (default: True)
Benefícios¶
- Visibilidade Total: Agora você sabe quando sistemas externos falham ao acessar a API
- Debug Facilitado: Informações completas da requisição facilitam identificar problemas
- Monitoramento Proativo: Alertas no Sentry permitem ação rápida
- Análise de Padrões: Tags permitem identificar origens problemáticas
- Resposta Apropriada: Clientes recebem mensagens claras sobre o erro
URLs Isentas de CSRF¶
O middleware DisableCSRFForAPIMiddleware já isenta algumas URLs:
/api/enviar_diarios//api/baixar_notas//__debug__/(Django Debug Toolbar)
Para adicionar novas URLs isentas, edite src/integrador/middleware.py:
Troubleshooting¶
Erro não aparece no Sentry¶
- Verifique se
SENTRY_DNSestá configurado - Confirme que o Sentry está inicializado (veja logs na inicialização)
- Verifique
SENTRY_SAMPLE_RATE(deve ser > 0)
Template 403_csrf.html não é exibido¶
- Verifique se o template está em
integrador/templates/ - Confirme que
integradorestá emINSTALLED_APPS - O fallback HTML será usado se o template não existir
Ainda recebo erro padrão do Django¶
- Confirme que
CSRF_FAILURE_VIEWestá configurado corretamente - Reinicie o servidor Django após alterações
- Verifique logs de erro do Django
Logs¶
Os erros CSRF também são registrados localmente:
logger.warning(
f"CSRF verification failed: {reason}",
extra={"request": request, "client_info": client_info}
)
Configure o nível de log em settings/loggings.py se necessário.
Próximos Passos¶
Para melhorias futuras, considere:
- Dashboard de Análise: Criar um dashboard no Sentry para visualizar padrões de falhas CSRF
- Alertas Automáticos: Configurar alertas para picos de erros CSRF
- Whitelist Dinâmica: Sistema para adicionar origens confiáveis via admin
- Rate Limiting: Implementar rate limiting para IPs com muitas falhas CSRF
- Documentação da API: Documentar requisitos de CSRF para integradores