Elquer Carlos

10.584 turns, innerHTML→createElement e a sessão que durou o dia todo

Sessão de 10.584 turns, XSS via innerHTML corrigido para createElement, criptografia FTP com AES-256-GCM, N+1 e migração de 11 views para Bootstrap 5.

10.584 turns numa única sessão de Claude Code. Das 01:33 às 19:28. É o tipo de número que diz mais sobre a densidade do trabalho do que qualquer descrição.

O primeiro item de segurança do dia foi a criptografia de credenciais FTP com AES-256-GCM. Credenciais FTP armazenadas em texto plano num banco de dados são uma vulnerabilidade óbvia — com acesso ao banco, um atacante tem acesso a todos os FTPs vinculados à plataforma. A criptografia com AES-256-GCM resolve isso: mesmo com acesso ao banco, os dados não são utilizáveis sem a chave.

O segundo item de segurança — menos óbvio mas igualmente importante — foi a substituição de innerHTML por createElement no bloco de subtipos de canal.

// antes — XSS via innerHTML
container.innerHTML = `<div class="${tipo}">${nome}</div>`;

// depois — createElement não interpreta HTML
const div = document.createElement('div');
div.className = tipo;
div.textContent = nome; // textContent, não innerHTML

innerHTML interpreta o conteúdo como HTML. Se algum dado vindo do servidor contiver tags ou scripts (por um bug, por manipulação da API, por injeção futura), innerHTML executa. createElement com textContent trata o conteúdo como texto puro — nunca como código.

Outro trabalho relevante do dia: eliminação de todos os confirm() nativos do browser em favor de modais Bootstrap reutilizáveis. O confirm() nativo não tem estilo, não tem personalização e bloqueia o thread principal. Modais Bootstrap são assíncronos, estilizados e permitem customização do texto e ações.

A migração do módulo postagem_plataformas avançou mais 11 views de UIKit para Bootstrap 5. E na frente de UX: breadcrumbs implementados, paginação visual no admin, aria-labels no calendário, validação inline no wizard de agendamento.

23 commits distribuídos em 4 áreas. Dia longo, mas com saídas concretas em cada frente.

Fim do ato