Painel Nicchon.com
Painel pessoal + showcase de segurança avançada + plataforma multi-tenant pra gerenciar instâncias WhatsApp Evolution (próprias e de clientes). Cofre AES-256-GCM, 2FA TOTP do zero, 3 camadas de detecção de ataques, inbox completo, e provisionamento de WhatsApp via QR no próprio painel.
Painel pessoal de gestão + portfolio + showcase de features de segurança avançadas + plataforma de gerenciamento de WhatsApp multi-tenant. Virou case real pra propostas de auth/cibersegurança/painel admin/automação WhatsApp. PHP 8 puro (PDO + prepared statements, zero ORM, padrão singleton) + Next.js frontend estático em Hostinger compartilhada barata. SEM composer.json — TODAS as primitivas (TOTP, crypto, QR, PDO, sessions) implementadas com built-in do PHP. Auditoria de segurança formal executada com 5 críticas + 11 altas + 15 médias mapeadas, executadas em sprints, com sistema próprio de migrations idempotentes versionadas em DB e rodadas via UI logada. Inbox completo de WhatsApp com auto-download de stickers, reactions, edições com histórico, deleções preservando original (anti-delete), localização, contato, sticker picker com favoritos e listas customizadas, busca full-text com ranking de relevância. Hub Evolution multi-tenant pra gerenciar instâncias próprias e dos clientes da agência Creatyze sem misturar privacidade.
- PHP 8 (PDO puro, sem ORM)
- Next.js (estático)
- MySQL
- Hostinger (shared)
- Evolution API (Baileys)
- Sistema próprio de migrations idempotentes
- Cofre cifrado AES-256-GCM com crypto-agility online: versionamento de blob com prefixo v1/v2, re-cifragem transacional on-unlock, master password separada da senha de login, master cifrada em sessão com session key dividida entre $_SESSION e cookie HttpOnly+SameSite=Strict (defesa contra dump de /tmp em shared hosting onde tenants compartilham /tmp/sess_*). Padrão raro de ver.
- PBKDF2 100k (v1) → 600k (v2) com migração online idempotente transacional, sessões ativas continuam funcionando.
- 2FA TOTP RFC 6238 implementado do zero (~70 linhas) com Base32 in-house e hash_equals timing-safe. Secret cifrado server-side via HKDF de PAINEL_SESSAO_KEY (prefixo ss1:) — dump puro do DB não recria 2FA. QR code renderizado client-side com lib local (sem vazar pra api.qrserver.com).
- Trust device com rotação de token bcrypt-hashado a cada uso, janela de tolerância 30s pra requests concorrentes, reuso fora da janela revoga TODOS os trust devices da conta + dispara alerta WhatsApp.
- 3 camadas de detecção de ataques com 11 tipos de alerta WhatsApp distintos (brute force, login IP novo, trust device suspeito, honeypot tocado, endpoint bloqueado, cofre destravado IP novo, senha trocada, master trocada, backup OK/falhou). Dedup persistente em DB com cooldowns configuráveis.
- Honeypots em ~20 paths via .htaccess rewrite (wp-admin, phpmyadmin, .env, .git, .aws, .ssh, Exchange, Fortinet) respondendo HTML/JSON plausível por categoria. Threshold de 5 hits/10min anti-ruído de crawler legítimo.
- Cobranças automáticas próprias com PIX recorrente e lembretes via WhatsApp (cron + templates por dias_offset) — sem dependência de Asaas, gestão própria.
- Headers de segurança completos via public/painel/.htaccess: CSP, HSTS preload, X-Frame-Options DENY, X-Content-Type-Options, Referrer-Policy, Permissions-Policy + bloqueio de _*.php, setup-*, diag-*, *.template, *.json, *.log, *.gz, *.sql.
- Hub Evolution multi-tenant: instâncias agrupadas por contexto (pessoal, agência, empregador, cliente) com isolamento automático — instâncias categoria=cliente ficam invisíveis no inbox/contatos pessoais. Master key cifrada por servidor Evolution (AES via HKDF), provisionamento de instância nova direto no painel via QR/pairing code com polling de estado e auto-config de webhook após pareamento.
- Inbox de WhatsApp completo com auto-download de stickers no recebimento, galeria com tabs (Todos / Favoritos / listas customizáveis), reactions de emoji, edições com histórico preservado, deleções com original visível (anti-delete), encaminhamento, busca full-text com ranking (exato > prefixo > prefixo-de-palavra > substring), lightbox de imagem com zoom + pinch mobile + dblclick toggle, voice memo gravado via MediaRecorder, localização via Leaflet/Nominatim, contato vCard.
- Resolução fuzzy de contato pra comandos de voz: tokeniza query, exige TODOS tokens presentes no nome, pontua por qualidade (exato 100 / prefixo 80 / prefixo-palavra 60 / substring 30 / só telefone 20), desempata por nome mais curto. 'Hugo irmão' resolve pra 'Hugo Tavares Sanchez Pinto (irmão)' deterministicamente; 'Hugo' sozinho retorna lista pra usuário falar com mais detalhe.
- Audit log de eventos Evolution (criada, conectada, desconectada, editada, deletada, erro, alerta_queda, alerta_volta) — trilha completa de operações sensíveis pra debug de incidentes e accountability quando expandir pra clientes terceiros.
- Voice Tokens cifrados bcrypt pra integração com Alexa Skill privada / Google Assistant via IFTTT / Tasker — endpoint /api/voice-command.php aceita JSON {intent, destinatario, texto}, rate-limit por token (10/min), log integral de cada chamada em painel_voice_log, escopo de ações por token, prefixo de 8 chars exposto na UI pra identificação sem revelar a chave.
- Defesa contra dump de /tmp em shared hosting Hostinger onde tenants compartilham /tmp/sess_*: master cifrada com session key dividida entre $_SESSION e cookie HttpOnly. Atacante precisa comprometer servidor E browser simultaneamente.
- TOTP recovery via WhatsApp com rate limit em DB (3/h, cooldown 60s) que desativa o 2FA pós-uso — recovery descartável, não pode virar backdoor.
- Sistema próprio de migrations idempotentes versionadas em DB, executadas via UI logada — sem CLI/SSH em hosting compartilhado.
- PWA do painel com manifest.webmanifest e service-worker.js — mesmo em hosting limitado, app-shell rápido.
- Multi-tenancy de instâncias WhatsApp sem misturar privacidade entre operador e clientes da agência: inbox/contatos do operador filtram fora qualquer instância marcada como categoria=cliente, capturar_msgs default=OFF pra cliente, aviso vermelho LGPD se operador tenta ligar captura em instância de terceiro, contatos vindos exclusivamente de instâncias de cliente ficam invisíveis na lista pessoal.
- WhatsApp Linked Device ID (@lid) em alguns DMs criava chats duplicados (mesma pessoa em dois chats — telefone e @lid) e o nome aparecia como 'Membro' genérico em grupos quando jid era opaco. Construí ferramenta /inbox-mesclar pra fundir manualmente + cache de pushName por participant + cross-reference @lid → telefone real via participantPn do payload da Evolution.
- View-once não capturável via Evolution/Baileys — Baileys silenciosamente descarta com 'Bad MAC' e Evolution ignora messageStubParameters. Documentei a limitação no painel após investigação do código upstream + instalei sniffer pra detectar se algum futuro update upstream consertar.