Ir para o conteúdo

Validador de E-mail — Checkout VTEX

Barra cadastro com e-mail descartável no checkout da loja useveggi.com.br e corrige erro de digitação de domínio (gmail.con → gmail.com).

Está no ar e funcionando sozinho

No ar desde 25/08/2026. Não precisa de manutenção diária — só quando aparecer domínio de ataque novo.

Onde fica

Item Valor
Worker veggi-validador-email
URL https://veggi-validador-email.veggiageral.workers.dev
KV binding CACHE — id 1a13f74b2f384fa484d2823e32ec9adc
Código-fonte C:\Projetos\vtex-analise\validador\
Snippet no checkout já colado em checkout6-custom.js (VTEX Admin)

Arquivos do projeto

Arquivo Papel
validador-core.mjs Regras — listas de domínios, MX, correções de digitação. Compartilhado entre Worker e CLI
worker.js O Cloudflare Worker — API de validação em tempo real
frontend-snippet.js Trecho que vai no formulário / checkout
higieniza.mjs CLI Node — passa um CSV do RD pelo mesmo núcleo de regras
wrangler.jsonc Configuração de deploy, KV e CORS

Endpoints

Endereço base

https://veggi-validador-email.veggiageral.workers.dev

As rotas abaixo são o caminho depois desse endereço.

Rota Método Resposta
/validar POST {permitir, status, risco, motivos[], sugestao, mensagem}
/validar-cpf POST {permitir, status, risco, motivos[], mensagem} — ver Bloquear E-mail e CPF
/stats GET Contadores do dia por status

Chaves na KV

Chave Conteúdo
dom:<dominio> Cache de DNS por domínio, 7 dias
blocklist Domínios bloqueados — alimentada pelo vigia-dominios.py
blocklist-emails E-mails bloqueados um a um — ver Bloquear E-mail e CPF
blocklist-cpfs Hashes SHA-256 de CPF — o número nunca é gravado

Variável de ambiente

Variável Valor atual
ORIGENS_PERMITIDAS https://www.useveggi.com.br,https://useveggi.com.br,https://useveggi.myvtex.com

Warning

Se a loja passar a usar outro domínio ou subdomínio, ele precisa ser acrescentado em ORIGENS_PERMITIDAS no wrangler.jsonc — senão o navegador bloqueia a chamada do checkout por CORS.


Quando aparecer domínio novo de ataque

Bloqueio imediato, sem deploy

O vigia-dominios.py já grava o arquivo da lista e imprime o comando pronto. Vale na hora, sem deploy:

cd "C:\Projetos\vtex-analise\validador"
wrangler kv key put --binding=CACHE blocklist --path blocklist-dominios.json --remote

Sempre --path, nunca o JSON na linha de comando

Até 28/08/2026 esta página mandava passar o JSON direto no comando:

wrangler kv key put --binding=CACHE blocklist '["novo1.com"]' --remote

Isso não funciona no PowerShell. Ele remove as aspas duplas ao repassar argumento para programa externo, e a KV recebe [novo1.com] — JSON inválido. O wrangler diz que gravou, nenhum erro aparece, e o bloqueio simplesmente não acontece.

Pior: até a correção do Worker no mesmo dia, uma lista ilegível derrubava a validação inteira — a exceção subia até o handler, que por princípio libera a venda quando algo quebra. Uma chave torta desligava o validador em silêncio.

O --path resolve porque o texto nunca passa pelo shell. Detalhes em Bloquear E-mail e CPF.

Confira sempre o que subiu — tem que sair com aspas em volta de cada domínio:

wrangler kv key get --binding=CACHE blocklist --remote

A chave blocklist não existia até 28/08/2026

O kv key get respondia 404: ela nunca chegou a ser criada. Essa camada nunca esteve ativa. Será criada no primeiro bloqueio de domínio feito pelo caminho novo.

Se o domínio já tiver sido consultado antes, o resultado está em cache por 7 dias. Limpe:

wrangler kv key delete --binding=CACHE "dom:novo1.com" --remote

Bloqueio permanente (recomendado depois de confirmar)

  1. Abrir validador-core.mjs
  2. Acrescentar o domínio em DOMINIOS_DESCARTAVEIS
  3. Publicar:
cd "C:\Projetos\vtex-analise\validador"
wrangler deploy

Vários domínios com o mesmo MX

Prefira acrescentar o hostname em MX_HOSTS_DESCARTAVEIS (ou o IP em MX_IPS_DESCARTAVEIS). Isso pega os próximos automaticamente, inclusive domínios que ainda nem existem, sem precisar atualizar nada.

Para descobrir o IP do MX de um domínio:

node -e "const d=require('dns').promises;(async()=>{const mx=await d.resolveMx('DOMINIO');console.log(mx[0].exchange,await d.resolve4(mx[0].exchange))})()"

Testar se está funcionando

curl.exe -s -X POST "https://veggi-validador-email.veggiageral.workers.dev/validar" -H "Content-Type: application/json" -d "{\"email\":\"teste@bocably.com\"}"

Deve responder "permitir":false. Com um e-mail seu, "permitir":true.

curl.exe, com o .exe

No PowerShell, curl sozinho é apelido para Invoke-WebRequest, que não entende -X, -H nem -d. Escrever curl.exe chama o programa de verdade. A versão anterior desta página omitia o .exe e quebrava.


Desligar às pressas

Se o validador estiver barrando cliente legítimo e for preciso parar já:

  1. VTEX Admin → Loja → Checkout → Código → checkout6-custom.js
  2. Apagar o bloco que começa com // VEGGI — validacao de e-mail até o })(); final
  3. Salvar

O checkout volta ao normal na hora.

Nunca apague nada acima desse bloco

Ali estão os scripts da Pagaleve e o campo de código de lojista.


Cuidados ao mexer no checkout

Faça backup antes

Sempre copie o conteúdo atual do checkout6-custom.js para um arquivo local antes de editar. A VTEX não tem histórico de versão nesse editor.

Situação O que acontece / o que fazer
Testar duas vezes seguidas Aguarde 2 minutos entre tentativas. A loja tem minimumPurchaseDowntimeSeconds = 120 e tentativas seguidas retornam CHK0328 / 429 — parece defeito, mas não é
Testar logado como admin (nat@veggi.com.br) Causa erro ORD062 / 401 na hora de pagar. Use conta de cliente comum
Testar um pedido até o fim sem pagar Escolha Pix e clique em finalizar. O pedido é criado, o QR aparece e você simplesmente não paga. Cancele no admin depois para não poluir o relatório do mês

O que este validador não faz

Não confirma se a caixa postal existe. Handshake SMTP (RCPT TO) não funciona contra Gmail/Outlook/Yahoo — eles respondem OK para qualquer endereço — e Workers não abrem porta 25. Nenhum validador pago resolve isso para os grandes provedores.

Info

O snippet no navegador segura o usuário honesto que errou o domínio. Bot não roda JavaScript. Contra automação o que vale é o Worker como validação server-side antes de gravar o lead — se a entrada for por API ou webhook, chame /validar ali também.


Diagnóstico

Sintoma Causa provável e ação
Cliente legítimo barrado no checkout Ver logs em Cloudflare → Workers → veggi-validador-email → Observability (observability já está ligado). Se for urgente, remover o bloco do checkout6-custom.js
Nenhuma validação acontece no checkout Bloco apagado do checkout6-custom.js ou erro de JS antes dele. Abrir DevTools (F12) → Console
Console mostra erro de CORS Domínio da loja fora de ORIGENS_PERMITIDAS. Acrescentar no wrangler.jsonc e wrangler deploy
Domínio bloqueado continua passando Resultado em cache (7 dias). Rodar wrangler kv key delete --binding=CACHE "dom:<dominio>" --remote
Blocklist parou de barrar domínios antigos O put na chave blocklist substitui a lista inteira — algum comando anterior sobrescreveu. Regravar com a lista completa
wrangler não encontrado npm i -g wrangler