Noções de segurança
Como usar secrets no Replit, e o que ainda assim é publicado
Como usar secrets no Replit: adicionar um, ler de volta e resolver as duas causas do undefined. E as chaves que a ferramenta Secrets não consegue proteger.

Em resumo
- Como usar secrets no Replit: abra a ferramenta Secrets, adicione um nome e um valor e leia esse valor no código como variável de ambiente.
- Isso mantém a chave fora dos seus arquivos. Não a mantém fora do aplicativo publicado, porque o que o código do navegador lê fica embutido no que cada visitante baixa.
- O sinal é o nome. Uma variável começada por VITE_ ou NEXT_PUBLIC_ foi colocada no navegador de propósito pela sua ferramenta de build.
- Um secret vazio no aplicativo publicado quase sempre significa que a versão no ar foi publicada antes de você criá-lo. Publique de novo.
Em algum ponto entre construir o seu aplicativo e publicá-lo, o Replit disse para você parar de colocar a chave de API no código. Então você foi procurar como usar secrets no Replit, moveu a chave para a ferramenta Secrets e o aviso sumiu. Depois alguém disse que a chave continua visível no seu aplicativo publicado, e as duas coisas parecem verdadeiras ao mesmo tempo.
São. Esta é a parte que a maioria dos conselhos sobre o assunto deixa de fora: a ferramenta Secrets decide onde um valor fica guardado. O seu código decide para onde ele é levado. São duas perguntas separadas, e só a primeira tem alguma coisa a ver com a ferramenta.
No Replit isso morde com mais força, porque a metade do seu aplicativo que roda na máquina do Replit e a metade que roda no notebook do visitante ficam no mesmo projeto, muitas vezes em arquivos vizinhos. Nada no editor traça uma linha entre elas.
Entre 12 e 14 de agosto de 2026 rodamos as mesmas nove verificações externas em 30.998 aplicativos no ar, dos quais 3.042 publicados no Replit. Em 219 desses aplicativos do Replit havia algo com formato de chave dentro do código que um visitante baixa. No conjunto da amostra, a maior parte do que essa verificação encontra é uma chave do Google, que com restrição costuma estar tudo bem. As que não estão são justamente aquelas que uma ferramenta de secrets deveria ter evitado. Os números completos estão no nosso relatório de varredura.
Como uso secrets no Replit?
Abra a ferramenta Secrets, adicione um nome e um valor e leia esse valor no seu código como variável de ambiente. Leva cerca de um minuto.
- No seu projeto, abra Secrets. Fica na lista de ferramentas, e procurar a palavra naquele painel encontra a ferramenta.
- Escolha + New secret. Dê a ele um nome em maiúsculas com sublinhados, como
OPENAI_API_KEY. Esse nome é o que o seu código vai usar, então importa mais do que parece. - Cole o valor no segundo campo e salve. O Replit criptografa o valor e o mantém fora dos arquivos do projeto.
- Leia o valor no código. Em JavaScript é
process.env.OPENAI_API_KEY, e em Python éos.getenv("OPENAI_API_KEY"). - Volte e apague o valor de onde ele estava antes.
O passo cinco é o que as pessoas pulam, e é dele que depende se tudo isso serviu para alguma coisa. Criar um secret não remove a cópia que você já tinha. Uma chave colada em um arquivo semana passada continua naquele arquivo, continua no histórico do projeto e continua dentro de cada cópia do seu aplicativo publicada desde então.
Um arquivo .env faz o mesmo trabalho da ferramenta Secrets, com uma diferença
que pesa: ele é um arquivo, então viaja junto com o projeto quando alguém faz um
fork ou o liga a um repositório.
Os secrets do Replit são seguros?
Para o que fazem, sim. O valor está criptografado, fica fora do seu código fonte, e as três formas mais comuns de uma chave escapar são todas fechadas por isso: você compartilha o projeto com alguém, você o liga a um repositório, ou alguém assiste você trabalhando.
Pense nisso como uma gaveta trancada. O que está na gaveta fica fora da vista de quem lê os seus arquivos. O que a gaveta não consegue decidir é o que o seu aplicativo faz com o conteúdo depois que o seu próprio código a abriu e saiu andando.
E um aplicativo Replit publicado sai andando com bastante coisa. Todo visitante que carrega o seu site recebe a metade da frente inteira, porque um navegador não consegue desenhar uma página que não recebeu. Se o código que abre a gaveta é código que vai para os visitantes, o valor que ele tirou viaja junto.
Qual metade do seu aplicativo lê a chave?
A metade que roda na máquina do Replit consegue ler um secret com segurança. A metade que roda no navegador do visitante não consegue, e o jeito habitual de fazer funcionar é também o jeito pelo qual a chave se torna pública.
O seu código de servidor é a parte que o Replit executa: uma rota Express, um handler em Python, uma função que fala com a OpenAI ou com a Stripe e devolve uma resposta ao seu aplicativo. Ela lê um secret, usa o valor, e o valor nunca sai da máquina.
O seu código de navegador é tudo o que o notebook do visitante executa. Em um projeto React é a maior parte do que você vem editando. Ele é compilado em um pacote de JavaScript e baixado inteiro por qualquer pessoa que abra o seu site.
process.env não existe em um navegador, então o código de navegador que o lê
não recebe nada. Para o valor chegar, alguém o renomeia: VITE_OPENAI_API_KEY em
um projeto Vite, ou NEXT_PUBLIC_OPENAI_API_KEY em um de Next.js. Funciona na
hora, porque esse prefixo é uma instrução à ferramenta de build para escrever o
valor dentro do pacote. A própria documentação do Vite diz isso com todas as
letras e desaconselha colocar chaves de API ali exatamente por esse motivo.
Então a verificação mais rápida deste artigo é uma busca. Abra o seu projeto e
procure por VITE_ e NEXT_PUBLIC_. Cada ocorrência é um valor que a sua
ferramenta de build tem ordem de publicar.
Para algumas isso está certo. Uma chave publicável do Supabase foi feita para ficar em um navegador, e uma chave do Google Maps com uma restrição de referenciador também. Está errado para tudo o que gasta dinheiro ou lê um banco de dados sem perguntar quem está batendo, e distinguir as duas leva cerca de um minuto por chave.
Se você prefere ver o que o seu aplicativo publicado está entregando antes de ir arquivo por arquivo, a nossa varredura gratuita lê o seu site por fora e diz o que consegue encontrar ali. Leva cerca de 20 segundos e não precisa de conta: escaneie seu aplicativo.
Por que meu secret do Replit não funciona?
Dois motivos, e de onde você está eles produzem o mesmo sintoma: um valor vazio e um aplicativo que não funciona.
O código que o lê roda no navegador. Ali não existe ambiente algum para ler,
então process.env.SUA_CHAVE está vazio e vai continuar assim. Isso não é um
problema de configuração, e recriar o secret quantas vezes quiser não muda nada.
A chamada que precisa da chave tem de mudar para a metade servidora do seu
aplicativo.
O seu aplicativo publicado está rodando uma versão mais antiga. O Replit mantém dois conjuntos de valores, os do seu workspace e aqueles com que o seu aplicativo publicado roda. Eles se sincronizam, então um secret que você adiciona normalmente chega ao deployment. O que o aplicativo no ar realmente usa, porém, é o que estava lá na última vez que você publicou. Adicione um secret depois e o aplicativo em funcionamento não saberá nada dele até você publicar de novo.
O guia do próprio Replit para um aplicativo que funciona no editor e quebra
depois de publicado começa exatamente neste ponto, então vale abrir os secrets de
deployment e ler os nomes antes de dar qualquer coisa como quebrada. Um nome
escrito OPENAI_KEY de um lado e OPENAI_API_KEY do outro produz o mesmo valor
vazio de um secret que não existe.
Uma implantação que falha à meia-noite é quando o atalho é tomado. Colar o valor direto no código desbloqueia em segundos, o aplicativo volta, e a chave fica no seu pacote publicado a partir daquele momento.
A chave já está no meu aplicativo publicado. E agora?
Gire a chave, antes de mudar qualquer código. No painel do provedor, gere uma chave nova e revogue a antiga.
Essa ordem importa porque a rotação é o único passo que faz o valor exposto parar de funcionar. Editar o seu código o tira da versão atual e o deixa no histórico do projeto, e não faz absolutamente nada quanto às cópias do seu pacote que já foram baixadas, guardadas em cache e rastreadas. O seu aplicativo ser pequeno também não ajuda: rastreadores automáticos leem sites públicos atrás de cadeias com formato de chave o tempo todo, sem a menor ideia de quem você é.
Depois, nesta ordem:
- Coloque a chave nova em Secrets e leia o valor só a partir de código de servidor.
- Mova a chamada que precisava dela. Tudo o que fala com a OpenAI, a Anthropic, a Stripe ou com o seu banco de dados usando uma chave administrativa pertence atrás de uma rota que o seu aplicativo chama, para que o navegador pergunte ao seu servidor e o seu servidor guarde a chave.
- Confira as páginas de uso e de cobrança do provedor no período em que a chave antiga esteve pública. A rotação para o que acontece de agora em diante e não diz nada sobre o que já aconteceu.
Chaves de provedores de modelos são as primeiras a conferir no Replit.
OPENAI_API_KEY é o exemplo a que a documentação do próprio Replit recorre
quando mostra como adicionar um secret, e não existe variante publicável de uma
chave da OpenAI ou da Anthropic. Cada uma delas cobra direto da sua conta.
Mais um lugar para olhar já que você está por aqui: se o seu projeto publica source maps, um visitante consegue ler esse pacote como os arquivos originais que você escreveu, com os seus próprios nomes de variável ainda neles.
O que fazer esta semana
O que fazer
- Mova todas as chaves para a ferramenta Secrets e depois apague as cópias que ficaram em arquivos. Criar um secret não remove o valor antigo.
- Procure
VITE_eNEXT_PUBLIC_no seu projeto. Cada ocorrência é um valor que a sua ferramenta de build publica de propósito, e cada uma precisa ser uma chave que podia ser publicada. - Para qualquer uma que não seja, mova a chamada que a usa para a sua metade servidora, para que o navegador pergunte ao seu aplicativo e o seu aplicativo guarde a chave.
- Se um secret aparece vazio no aplicativo publicado mas funciona no editor, publique de novo e confira o nome nos seus secrets de deployment antes de mexer no código.
- Gire no provedor tudo o que já saiu, antes de tocar no código. Depois leia a página de cobrança das semanas em que a chave esteve pública.
Faça a busca primeiro. Leva um minuto, não precisa instalar nada e diz quais das chaves do seu projeto já são públicas. A lista de segurança de 10 minutos cobre o resto do que vale confirmar em um aplicativo recém-lançado, e o guia em linguagem simples para esta plataforma é o seu aplicativo Replit é seguro?.
Perguntas frequentes
Os secrets do Replit são seguros?
Para o que fazem, sim. O Replit criptografa os valores e os mantém fora dos seus arquivos, então compartilhar o projeto, ligá-lo a um repositório ou transmitir enquanto você trabalha já não entrega a chave a quem está olhando. O que a ferramenta não consegue decidir é para onde o seu aplicativo leva o valor depois. Uma chave lida por código que roda na máquina do Replit fica no Replit. A mesma chave lida por código que roda no navegador do visitante fica embutida no que você publica, e tê-la guardado antes em Secrets não muda nada disso.
Por que meu secret do Replit aparece como undefined?
Duas causas, e de onde você está elas parecem idênticas. Ou o código que o lê roda no navegador, onde não existe ambiente algum para ler e process.env não tem nada dentro, ou o seu aplicativo publicado está rodando uma versão implantada antes de você criar o secret. Para o segundo caso, publique de novo: um aplicativo no ar usa os valores que existiam na última vez que ele saiu.
Posso usar um secret no meu frontend em React no Replit?
Você pode colocar um valor ali, e ele não será secreto. O código React roda na máquina do visitante, então tudo o que ele lê precisa ser enviado para lá primeiro. As ferramentas de build deixam isso explícito com um prefixo: o Vite só expõe ao código do navegador as variáveis começadas por VITE_, e o Next.js só as NEXT_PUBLIC_. Adicionar o prefixo é como se faz uma chave funcionar no frontend, e é também o momento em que essa chave se torna pública. Chaves publicáveis pertencem ali. Tudo o que gasta dinheiro ou lê um banco de dados pertence ao servidor.
Preciso adicionar meus secrets de novo quando publico?
Normalmente não, porque os secrets de deployment se sincronizam com os do seu workspace, mas o valor que o aplicativo no ar usa é o que estava presente na sua última publicação. Um secret adicionado depois chega ao deployment na publicação seguinte. O guia do próprio Replit para um aplicativo que funciona no editor e falha depois de publicado começa aqui, então se algo faltou na implantação, abra os secrets de deployment e confira se o nome está lá e escrito igual.
Colei uma chave de API em um arquivo antes de descobrir a ferramenta Secrets. Basta apagar o arquivo?
Não. Gire a chave no provedor primeiro, que é o que realmente fecha a porta, e depois mova o valor para Secrets. Apagar uma linha de código a tira da versão atual e não do histórico do projeto, nem de qualquer cópia do seu aplicativo publicado que alguém já tenha. A rotação é o único passo que faz o valor antigo parar de funcionar, e costuma levar cerca de um minuto no painel do provedor.