Bastidores

Desenvolvimento· Arrumando a casa · parte 14

Separei o painel do site e pus o Access na porta.

Um script injetado no site público alcançava o painel pela sessão do operador. Separei o painel em app e endereço próprios, atrás do Access.

Painel administrativo separado do site público, atrás de uma porta com login por código.

A sessão do operador valia em todas as páginas do site público. Um script injetado em qualquer página alcançaria o painel com essa sessão. Eu separei o painel do site e coloquei o Cloudflare Access na frente dele.

O risco morava na origem compartilhada. Origem é o endereço que o navegador usa para decidir quais páginas dividem a mesma sessão. Página pública e painel na mesma origem dividem alcance de cookie.

A origem pública carrega scripts que eu controlo só em parte

As páginas públicas carregam pixel, tag e scripts de terceiros. Cada script roda no contexto da página que o visitante abriu. Uma falha de injeção em uma página pública abre caminho para chamadas feitas com a sessão de quem estiver logado.

A sessão do operador valia para todas as páginas dessa origem. Um script injetado chamaria as rotas do painel usando a sessão válida. A proteção que impede a leitura do cookie pela página continua permitindo o uso dele nas chamadas.

Esse desenho fazia a segurança do painel depender de todas as páginas públicas. Cada página nova e cada script novo aumentavam a superfície de ataque do painel. O painel pagava o risco de um site feito para receber visita e medir campanha.

Nada ficava entre a internet e a tela de login do painel além do próprio aplicativo. Qualquer pessoa podia abrir a tela e tentar entrar. A lista de operadores e o código de e-mail carregavam sozinhos a defesa da entrada.

O painel virou um app próprio em endereço próprio

A saída foi tirar o painel de dentro do site. O painel virou um app próprio, com rotas e tratamento de sessão dele. O site público voltou a cuidar das páginas públicas e das tarefas dele.

O app do painel roda em endereço próprio, separado do endereço do site. A sessão do operador pertence só a esse endereço. Página pública aberta no mesmo navegador fica fora do alcance dessa sessão.

No Garfim, essa separação corrigiu um problema concreto de arquitetura. O painel tinha virado uma ilha dentro do site e repetia, de forma manual, o que o modelo de app já entregava pronto. App próprio resolveu a segurança e a manutenção na mesma mudança.

Um script plantado na página pública ainda pode tentar criar um cookie falso com o nome da sessão. Esse cookie chega ao painel como uma sessão inventada. A conferência de identidade barra a tentativa, e o efeito máximo é um painel deslogado.

O Access fecha a porta antes da tela de login

O Cloudflare Access fica na frente de todo o endereço do painel. Ele roda na borda da Cloudflare, antes de o pedido chegar ao app. Quem fica fora da lista de operadores nem enxerga a tela de login.

O operador entra em duas etapas separadas. Primeiro ele passa pelo Access com o código enviado a ele. Depois ele entra no painel com o login dele e o segundo fator.

O segundo fator amarra a entrada a algo além do código enviado por e-mail. No modelo que adotei, o painel pede código de uso único gerado no aparelho do operador.

A API confere tudo de novo a cada chamada do painel. Ela verifica a origem da chamada, a passagem pelo Access e a sessão do operador. Falta de configuração de conferência fecha o painel em vez de liberar a entrada.

Três produtos meus usam esse mesmo modelo de painel. O webmail central também fica atrás do Access. A repetição facilita a operação, porque cada painel novo nasce com a mesma porta de entrada.

O limite do modelo aparece fora do navegador

Apps nativos não passam pelo Access. O aplicativo de celular fala direto com a API, sem atravessar a porta que protege o painel no navegador. A proteção do painel cobre a operação no computador e deixa o app com as regras próprias dele.

Por isso a API mantém as conferências dela para todas as chamadas. Access fechado no painel e API aberta em outro caminho anulariam a separação. Cada caminho de entrada precisa da própria verificação de identidade e permissão.

Também existe um atrito de operação nessa escolha. O operador entra duas vezes, uma no Access e outra no painel. Cada ambiente novo pede a configuração do Access antes da publicação da API, sob risco de painel trancado.

Eu aceito esse atrito porque ele aparece uma vez na entrada. O risco anterior aparecia em todas as páginas públicas, todos os dias. Trocar risco permanente por atrito de login foi a conta que fechou a decisão.

Painel separado virou o padrão dos meus produtos

Hoje cada produto novo já nasce com o painel fora do site público. App próprio, endereço próprio e Access na frente formam o ponto de partida. O site público pode mudar de campanha e de script sem arrastar o painel junto.

A lição serve para qualquer operação com área restrita. Junte no mesmo endereço só o que pode dividir a mesma sessão com segurança. Página com script de terceiros e painel de operação pedem endereços separados.

Quem mantém painel dentro do site pode começar pelo inventário de scripts das páginas públicas. Cada pixel e cada tag listados respondem pela urgência da separação. Depois da separação, o deploy a partir da minha máquina publica site e painel como peças independentes, cada uma com a própria conferência.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s