[{"data":1,"prerenderedAt":778},["ShallowReactive",2],{"blog-pt-is-replit-safe":3,"blog-index-pt":538},{"id":4,"title":5,"body":6,"category":496,"cover":497,"coverAlt":498,"description":499,"draft":500,"extension":501,"faq":502,"image":518,"keywords":519,"meta":527,"navigation":528,"ogTitle":5,"path":529,"published":530,"seo":531,"stem":532,"tldr":533,"updated":530,"__hash__":537},"blog_pt\u002Fblog\u002Fis-replit-safe.md","O Replit é seguro? O que vimos em 3.042 aplicativos Replit no ar",{"type":7,"value":8,"toc":481},"minimark",[9,13,21,24,29,32,35,57,60,66,70,83,230,233,238,242,245,253,256,260,263,274,279,285,293,300,304,312,315,330,334,337,345,361,365,368,371,379,383,386,420,424,427,434,438,468],[10,11,12],"p",{},"Você construiu algo no Replit, funciona, e está prestes a colocar pessoas de\nverdade nele. Em algum momento dessa semana você digitou «o replit é seguro» em\numa caixa de busca, e o que voltou foi ou uma página sobre as certificações do\nReplit ou uma página sobre um agente de IA que apagou um banco de dados.\nNenhuma das duas disse uma palavra sobre o aplicativo que você está prestes a\npublicar.",[10,14,15,16,20],{},"Aqui está a parte que a maioria dessas respostas erra: ",[17,18,19],"strong",{},"«o Replit é seguro?»\nsão três perguntas em uma frase só",", e a que decide se estranhos conseguem ler\nos dados dos seus usuários é a que quase ninguém mede.",[10,22,23],{},"Nós conseguimos medir. Entre 12 e 14 de agosto de 2026 passamos 30.998\naplicativos no ar pelas mesmas nove verificações externas que qualquer pessoa\npode rodar de graça na nossa página inicial, e 3.042 deles estavam publicados no\nReplit. Isto é o que voltou para esses, e onde a nossa visão para.",[25,26,28],"h2",{"id":27},"o-replit-é-seguro","O Replit é seguro?",[10,30,31],{},"Como host, não era onde os achados estavam. As duas coisas que conseguimos ver\nda hospedagem de fora voltaram limpas em cada aplicativo que respondeu, e os\nnove aplicativos com nota D ou F chegaram lá todos por algo dentro do\naplicativo.",[10,33,34],{},"Pense no Replit como uma loja alugada com uma oficina nos fundos. O dono do\nimóvel é dono do prédio e da fechadura da porta da rua. Quem montou a loja\ndecidiu onde vão as prateleiras e como os fundos se ligam à frente. E o que um\npassante consegue alcançar da calçada é você quem decide, toda vez que abre. São\ntrês perguntas diferentes, e uma boa resposta às duas primeiras não diz nada\nsobre a terceira.",[36,37,38,45,51],"ol",{},[39,40,41,44],"li",{},[17,42,43],{},"A plataforma."," Se o Replit hospeda o seu aplicativo direito: um\ncertificado válido, um domínio que não vai vencer, secrets criptografados e\nfora dos seus arquivos. Esse é o dono do imóvel.",[39,46,47,50],{},[17,48,49],{},"O agente."," Se o código que a IA do Replit escreve é seguro. Esse é o\ninstalador, e nenhum escaneamento de fora consegue ver a fiação.",[39,52,53,56],{},[17,54,55],{},"O aplicativo que você publicou."," O que um estranho consegue alcançar da\nrua: uma chave no código que um navegador baixa, uma rota de API que\nresponde sem login, um arquivo que nunca deveria ter tido uma URL.",[10,58,59],{},"As nossas verificações leem a terceira. Sobre a primeira, o certificado era\nválido nos 3.028 aplicativos em que conseguimos ler um, e nenhum domínio de\n3.042 estava perto de vencer. Sobre a segunda não temos nada para medir, e a\nseção sobre isso mais abaixo diz isso.",[61,62],"diagram",{"alt":63,"caption":64,"src":65},"Três painéis lado a lado. O primeiro contém o logotipo do Replit com um cadeado e um certificado ao lado. O segundo contém um símbolo de código com uma faísca por cima. O terceiro contém uma página de navegador na frente de um servidor, três visitantes se aproximando dela, e uma lupa desenhada só sobre esse painel, com o número 3.042 embaixo.","Três perguntas dentro de uma busca só. Um escaneamento de fora lê o terceiro painel e nada nos outros dois.","\u002Fblog\u002Fis-replit-safe\u002Fthree-questions-1600x700.png",[25,67,69],{"id":68},"o-que-encontramos-em-3042-aplicativos-replit","O que encontramos em 3.042 aplicativos Replit",[10,71,72,73,76,77,82],{},"Nove verificações, rodadas de fora, sem login e sem acesso à conta de ninguém.\nNunca lemos uma linha: onde um banco de dados respondeu, perguntamos quantas\nlinhas ele entregaria e paramos ali. Nenhum aplicativo é nomeado aqui nem em\nnenhum outro lugar que publicamos. Cada parcela abaixo é sobre os aplicativos em\nque aquela verificação ",[17,74,75],{},"respondeu",", porque uma verificação que não conseguiu\nterminar é desconhecida e não aprovada, e essa regra é o motivo de os\ndenominadores mudarem. O método e os dados estão\n",[78,79,81],"a",{"href":80},"\u002Fresearch\u002Fvibe-coded-app-security-2026","no relatório",".",[84,85,86,103],"table",{},[87,88,89],"thead",{},[90,91,92,96,100],"tr",{},[93,94,95],"th",{},"O que verificamos",[93,97,99],{"align":98},"right","Aplicativos Replit",[93,101,102],{},"Quem decide",[104,105,106,118,129,139,150,160,170,189,199,209,220],"tbody",{},[90,107,108,112,115],{},[109,110,111],"td",{},"Cabeçalhos de segurança do navegador faltando",[109,113,114],{"align":98},"2.924 de 3.042 (96%)",[109,116,117],{},"O que serve a página",[90,119,120,123,126],{},[109,121,122],{},"Uma rota de API que respondeu a um estranho com dados",[109,124,125],{"align":98},"1.050 de 3.037 (35%)",[109,127,128],{},"O seu aplicativo",[90,130,131,134,137],{},[109,132,133],{},"Algo em forma de chave no código que um visitante baixa",[109,135,136],{"align":98},"219 de 3.042 (7%)",[109,138,128],{},[90,140,141,144,147],{},[109,142,143],{},"Código-fonte original publicado (source maps)",[109,145,146],{"align":98},"168 de 3.041 (6%)",[109,148,149],{},"Uma configuração de build",[90,151,152,155,158],{},[109,153,154],{},"Qualquer site autorizado a chamar a sua API",[109,156,157],{"align":98},"76 de 3.037",[109,159,128],{},[90,161,162,165,168],{},[109,163,164],{},"Qualquer site autorizado a chamá-la com os cookies dos seus usuários",[109,166,167],{"align":98},"56 de 3.037",[109,169,128],{},[90,171,172,184,187],{},[109,173,174,175,179,180,183],{},"Um arquivo privado como ",[176,177,178],"code",{},".env"," ou ",[176,181,182],{},".git\u002Fconfig"," em uma URL pública",[109,185,186],{"align":98},"7 de 3.023",[109,188,128],{},[90,190,191,194,197],{},[109,192,193],{},"Uma tabela do banco de dados legível sem login",[109,195,196],{"align":98},"4 de 3.033",[109,198,128],{},[90,200,201,204,207],{},[109,202,203],{},"Um bucket de storage que lista os próprios arquivos",[109,205,206],{"align":98},"0 de 3.035",[109,208,128],{},[90,210,211,214,217],{},[109,212,213],{},"Certificado vencido ou não confiável",[109,215,216],{"align":98},"0 de 3.028",[109,218,219],{},"Replit",[90,221,222,225,228],{},[109,223,224],{},"Domínio prestes a vencer",[109,226,227],{"align":98},"0 de 3.042",[109,229,219],{},[10,231,232],{},"As notas: 2.789 A, 183 B, 61 C, 8 D e 1 F. Trinta e um aplicativos não tinham\nnenhum achado.",[61,234],{"alt":235,"caption":236,"src":237},"Sete barras horizontais em uma mesma escala, cada uma precedida por um pequeno símbolo e terminada em um número: 2.924 para os cabeçalhos, 1.050 para as rotas abertas, 219 para as chaves, 168 para os source maps, 76 e 56 para os dois achados cross-origin, e 7 para os arquivos privados. A barra de cima está em um cinza pálido e as outras em turquesa, com o 7 desenhado como uma linha fina com um anel em volta.","Uma escala para as sete. A barra cinza é decidida pela hospedagem. Cada barra turquesa veio de algo dentro do aplicativo.","\u002Fblog\u002Fis-replit-safe\u002Fwhat-we-found-1600x720.png",[25,239,241],{"id":240},"por-que-99-tinham-um-achado-diz-pouco-aqui","Por que «99% tinham um achado» diz pouco aqui",[10,243,244],{},"Porque 2.924 desses achados são o mesmo, e é a linha menos urgente que um\nrelatório pode carregar.",[10,246,247,248,252],{},"Os cabeçalhos de segurança do navegador são enviados pelo que serve a sua\npágina. No domínio próprio de um builder, isso é o builder, e é por isso que o\nnúmero é 96% aqui, 99% no Lovable e 100% no v0, e por isso todo aplicativo no\nmesmo host recebe a mesma resposta. O Replit é um dos poucos lugares em que você\nconsegue mudar isso: se o seu aplicativo roda o próprio servidor, é esse\nservidor que envia os cabeçalhos, e\n",[78,249,251],{"href":250},"\u002Fblog\u002Fmissing-security-headers","adicioná-los são poucas linhas",". Vale a pena,\ne não é disso que um D é feito.",[10,254,255],{},"Tire essa linha e 1.798 dos 3.042 aplicativos não tinham nada que viesse do que\nfoi construído. Os outros 1.244 são onde o resto deste artigo mora.",[25,257,259],{"id":258},"o-achado-com-a-cara-do-replit-uma-rota-de-api-própria","O achado com a cara do Replit: uma rota de API própria",[10,261,262],{},"A coisa mais comum que encontramos e que um dono tinha colocado ali era uma\nrota no próprio servidor do aplicativo que respondia a um estranho com dados.\n1.050 de 3.037 aplicativos tinham pelo menos uma.",[10,264,265,266,269,270,273],{},"Um aplicativo Lovable é um front-end mais um banco de dados que outra pessoa\nroda. Um aplicativo Replit costuma ser a loja inteira: a página, e atrás dela\num servidor que conversa com o banco de dados, no mesmo projeto e muitas vezes\nescritos na mesma sessão. A sétima das nossas nove verificações lê os caminhos\nde API escritos no JavaScript do seu aplicativo, ",[176,267,268],{},"\u002Fapi\u002Forders",", ",[176,271,272],{},"\u002Fapi\u002Fusers",",\no que encontrar, e pergunta a cada um, sem login, se ele responde. No Lovable\nisso disparou em 8 aplicativos de 18.518, porque em geral não há um servidor do\ndono para perguntar. No Replit disparou em 1.050.",[61,275],{"alt":276,"caption":277,"src":278},"Dois aplicativos desenhados lado a lado. À esquerda, uma página de navegador com uma seta tracejada saindo do painel para um cilindro de banco de dados fora dele, e o número 8 embaixo. À direita, uma página de navegador com um servidor desenhado atrás dentro do mesmo painel, um visitante na borda do painel recebendo um bloco de dados desse servidor, e o número 1.050 embaixo.","O aplicativo da esquerda não tem servidor próprio para deixar aberto. O da direita tem, e é ali que estão os seus achados.","\u002Fblog\u002Fis-replit-safe\u002Fthe-server-you-own-1600x640.png",[10,280,281,282,284],{},"É classificado como médio porque às vezes isso é exatamente o certo. Uma rota\nque devolve a sua lista pública de produtos deve responder a todo mundo. Está\nerrado quando a rota é ",[176,283,272],{}," e a resposta são os seus usuários com os\nendereços de e-mail, e você descobre porque qualquer pessoa pode abrir esse\nendereço em uma aba e ler. Uma rota que deve ser privada precisa de uma\nverificação de login, e todo mundo sem login recebe um 401.",[10,286,287,288,292],{},"Na loja, essa é a porta dos fundos que abre pela rua. Se você já usou o\nSupabase, é a mesma falha que viu descrita como\n",[78,289,291],{"href":290},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","uma tabela sem Row Level Security",",\ncom outra forma. As linhas ficam legíveis porque nada entre o estranho e os\ndados perguntou quem ele era.",[10,294,295,296,82],{},"Dois achados menores ficam ao lado. 76 aplicativos disseram a qualquer site do\nmundo que ele podia chamar a sua API, e outros 56 permitiram isso com os\ncookies de login do visitante anexados, que é a versão que deixa outro site\nagir como o seu usuário e\n",[78,297,299],{"href":298},"\u002Fblog\u002Fcors-wildcard-security-risk","a que raramente é correta",[25,301,303],{"id":302},"do-que-é-feito-7-enviaram-um-secret","Do que é feito «7% enviaram um secret»",[10,305,306,307,311],{},"Sobretudo de chaves do Google. 219 dos 3.042 aplicativos tinham algo em forma\nde chave no código que um visitante baixa, e 200 deles eram uma chave de API do\nGoogle, que costuma estar bem depois de ser\n",[78,308,310],{"href":309},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","restringida ao seu próprio domínio",".\nTrinta e dois carregavam um valor em forma de chave que não conseguimos\natribuir a um provedor. Três aplicativos guardavam uma chave que cobra de uma\nconta diretamente: uma chave da OpenAI, da Anthropic ou da AWS.",[10,313,314],{},"Três em 3.042 é raro. Também é o achado que custa dinheiro sozinho, a chave do\ncaixa deixada no balcão, e costuma aparecer como uma fatura de uso que chega\nantes de alguém perceber. Um scanner que compara formas imprimiria todos os 219\ncomo problemas; nós lemos o que cada chave consegue fazer, porque a alternativa\né ensinar você a ignorar o aviso no dia em que ele importa.",[10,316,317,318,322,323,179,326,329],{},"No Replit o caminho que uma chave faz até o bundle é específico o bastante para\nter ",[78,319,321],{"href":320},"\u002Fblog\u002Freplit-secrets-explained","um artigo próprio",". A ferramenta Secrets\nmantém um valor fora dos seus arquivos, e faz isso bem. Não consegue mantê-lo\nfora do navegador se é código do navegador que o lê, e o jeito como as pessoas\nfazem isso funcionar é renomear a variável para ",[176,324,325],{},"VITE_",[176,327,328],{},"NEXT_PUBLIC_",", que\né uma instrução para a ferramenta de build publicá-la.",[25,331,333],{"id":332},"os-dois-que-você-corrige-com-uma-configuração","Os dois que você corrige com uma configuração",[10,335,336],{},"Source maps e um arquivo privado perdido. Os dois se decidem em como o projeto\né construído, e os dois são uma configuração, e não uma reescrita.",[10,338,339,340,344],{},"168 aplicativos publicavam source maps, o que significa que os arquivos\noriginais por trás do aplicativo, comentários incluídos, ficam legíveis nas\nferramentas de desenvolvedor de qualquer navegador. No Replit a configuração de\nbuild está no seu projeto, então o interruptor é seu;\n",[78,341,343],{"href":342},"\u002Fblog\u002Fsource-maps-exposed-in-production","o que um map publicado expõe e o que não expõe","\nvale a leitura antes de você decidir que não importa.",[10,346,347,348,350,351,353,354,356,357,360],{},"Sete aplicativos serviam um arquivo privado de uma URL comum: um ",[176,349,178],{},", um\n",[176,352,182],{},". Cinco dos nove aplicativos com nota D ou F tinham esse achado, e\nele é o caminho mais curto para um dia ruim de toda a lista, porque um ",[176,355,178],{},"\nem uma URL é cada chave dentro dele em uma única requisição. Em uma janela\nprivada, abra o seu endereço publicado com ",[176,358,359],{},"\u002F.env"," no final. Deve falhar. Se\nmostrar texto, troque hoje cada chave desse arquivo e depois tire o arquivo\ndo que você publica.",[25,362,364],{"id":363},"o-código-que-o-agente-do-replit-escreve-é-seguro","O código que o agente do Replit escreve é seguro?",[10,366,367],{},"Não medimos, e nenhum escaneamento de fora consegue. O que um escaneamento vê é\no resultado: as 1.050 rotas abertas e as três chaves que cobram foram escritas\npor alguém, um agente ou uma pessoa, e publicadas.",[10,369,370],{},"O que está registrado é um evento. Em julho de 2025 o agente do Replit apagou\num banco de dados de produção no meio de uma sessão em que tinha sido instruído\na não mudar nada, e o CEO do Replit reconheceu isso publicamente; separar os\nbancos de dados de desenvolvimento dos de produção fez parte da resposta da\nempresa. O que segue disso para você é o mesmo em todo builder com um agente\ndentro: mantenha o agente longe do banco de dados em produção, e guarde uma\ncópia dos seus dados em algum lugar aonde o agente não chega.",[10,372,373,374,378],{},"Onde essa cópia mora depende de onde os seus dados estão. Se o seu aplicativo\nReplit os guarda no Supabase, é ",[78,375,377],{"href":376},"\u002Fsupabase-backups","isso que o Care guarda",". Se\nestão no banco de dados do próprio Replit, não conseguimos fazer backup dele, e\no que vale ler antes de precisar é o que a ferramenta de banco de dados do\nReplit oferece para uma restauração. Só 14 dos 3.042 aplicativos Replit que\nescaneamos nomeavam um projeto do Supabase, então para a maioria vale o segundo\ncaso.",[25,380,382],{"id":381},"a-verificação-de-cinco-minutos-no-seu-próprio-aplicativo-replit","A verificação de cinco minutos no seu próprio aplicativo Replit",[10,384,385],{},"Cada uma é uma URL que você abre ou uma busca que você roda. Use uma janela\nprivada, para que o seu próprio login não responda por um estranho.",[36,387,388,398,401,410,413],{},[39,389,390,391,393,394,397],{},"Abra o seu endereço publicado com ",[176,392,359],{}," no final, depois ",[176,395,396],{},"\u002F.git\u002Fconfig",".\nOs dois devem falhar. Se algum mostrar texto, troque hoje cada chave que\nestiver nele.",[39,399,400],{},"Abra do mesmo jeito uma das suas próprias rotas de API, uma que você não\ngostaria que um estranho lesse. Se ela responder, essa rota precisa de uma\nverificação de login.",[39,402,403,404,406,407,409],{},"Procure ",[176,405,325],{}," e ",[176,408,328],{}," no seu projeto. Cada resultado é um valor\nque a sua ferramenta de build publica de propósito, e cada um tem que ser\numa chave que era seguro publicar.",[39,411,412],{},"Abra o seu aplicativo no ar e depois a aba Sources das ferramentas de\ndesenvolvedor do navegador. Se você consegue ler os seus arquivos originais\ncom os comentários, os source maps estão ligados.",[39,414,415,416,82],{},"Ou deixe o escaneamento fazer isso. Ele roda essas quatro e mais cinco de\nfora, leva uns 20 segundos, não precisa de conta, e imprime «Não foi possível\nverificar» para tudo o que não conseguiu responder em vez de uma marca de\nverificação: ",[78,417,419],{"href":418},"\u002Fsecurity-scanner","escaneie seu aplicativo",[25,421,423],{"id":422},"o-que-muda-depois-que-você-publica-de-novo","O que muda depois que você publica de novo?",[10,425,426],{},"Qualquer coisa. Publicar no Replit é um gesto só, então uma mudança está no ar\nno momento em que você a faz, e não há nenhuma etapa de deploy entre você e a\ninternet para pegar uma rota que perdeu a verificação de login ou uma chave\ncolada à meia-noite para passar por um build que estava falhando. Um\nescaneamento que você rodou no mês passado descreve o aplicativo do mês\npassado.",[10,428,429,433],{},[78,430,432],{"href":431},"\u002Fpricing","Reeve Monitor"," foi feito para esse formato de aplicativo: alguém que\npassa na frente da loja a cada hora e testa as portas. Ele roda de novo as nove\nverificações a cada hora em até três aplicativos, vigia a disponibilidade a\ncada 60 segundos, avisa você quando um resultado muda em vez de esperar você\nolhar, e envia um relatório mensal. Custa $12 por mês no preço de lista, com\nsete dias grátis antes de cobrar; a página de preços às vezes fica abaixo do\nvalor daqui e nunca acima. O Monitor vigia e nada mais, o que para um\naplicativo Replit costuma ser a metade certa: o Care, nosso plano de backup,\nguarda somente uma cópia de um banco de dados do Supabase, e a maioria dos\naplicativos Replit guarda os dados em outro lugar.",[25,435,437],{"id":436},"o-que-fazer-esta-semana","O que fazer esta semana",[439,440,441],"key-takeaways",{},[442,443,444,452,455,462,465],"ul",{},[39,445,446,447,406,449,451],{},"Abra ",[176,448,359],{},[176,450,396],{}," no seu endereço publicado em uma janela privada. Os dois devem falhar.",[39,453,454],{},"Abra as suas próprias rotas de API sem login. Qualquer rota que responda com dados privados precisa de uma verificação de login, e de um 401 para todo o resto.",[39,456,403,457,406,459,461],{},[176,458,325],{},[176,460,328],{}," no projeto. Cada resultado é publicado de propósito e tem que ser uma chave que era seguro publicar.",[39,463,464],{},"Desligue os source maps na configuração de build, a menos que você queira os arquivos originais legíveis pelo navegador.",[39,466,467],{},"Mantenha o agente longe do banco de dados em produção, e guarde uma cópia dos seus dados em algum lugar aonde ele não chega.",[10,469,470,471,475,476,480],{},"O guia em linguagem simples para esta plataforma é\n",[78,472,474],{"href":473},"\u002Fis-your-replit-app-safe","o seu aplicativo Replit é seguro?",", e o\n",[78,477,479],{"href":478},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre o que vale a pena\nconfirmar em qualquer aplicativo recém-lançado.",{"title":482,"searchDepth":483,"depth":483,"links":484},"",3,[485,487,488,489,490,491,492,493,494,495],{"id":27,"depth":486,"text":28},2,{"id":68,"depth":486,"text":69},{"id":240,"depth":486,"text":241},{"id":258,"depth":486,"text":259},{"id":302,"depth":486,"text":303},{"id":332,"depth":486,"text":333},{"id":363,"depth":486,"text":364},{"id":381,"depth":486,"text":382},{"id":422,"depth":486,"text":423},{"id":436,"depth":486,"text":437},"Noções de segurança","\u002Fblog\u002Fis-replit-safe\u002Fcover-1200x630.png","O logotipo do Replit sobre um azulejo branco, uma seta para uma página com um servidor atrás, e outra seta para três visitantes.","O Replit é seguro? Passamos 3.042 aplicativos Replit no ar por nove verificações externas. Os achados estavam no aplicativo publicado, não no host.",false,"md",[503,506,509,512,515],{"q":504,"a":505},"O Replit é seguro para um produto de verdade?","Como host, nada nos 3.042 aplicativos Replit no ar que escaneamos apontava para a hospedagem: cada certificado que conseguimos ler era válido e nenhum domínio estava perto de vencer. Os achados que decidiram uma nota estavam todos dentro do aplicativo que cada dono publicou, e têm a mesma forma em todo builder que medimos. Se o seu produto é seguro rodando lá depende do que o seu aplicativo entrega a um visitante, e isso você confere em uns cinco minutos.",{"q":507,"a":508},"Os Replit Secrets são secretos mesmo?","Para o trabalho que fazem, sim. O valor é criptografado e mantido fora dos arquivos do projeto, então compartilhar ou fazer fork do projeto não o entrega. 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 lá. Uma chave lida por código que roda no navegador do visitante é embutida no que você publica, não importa onde estava guardada, e uma variável chamada VITE_ ou NEXT_PUBLIC_ é exatamente isso.",{"q":510,"a":511},"As pessoas conseguem ver o meu código-fonte no Replit?","A metade do navegador, sempre, porque um navegador não consegue desenhar uma página que não recebeu. Se elas a veem como os arquivos originais que você escreveu ou como saída comprimida depende dos source maps, que 168 de 3.041 aplicativos Replit verificados estavam publicando. O seu código de servidor fica no Replit, a menos que um arquivo privado como .env ou .git\u002Fconfig tenha ganhado uma URL pública, o que 7 de 3.023 aplicativos tinham feito.",{"q":513,"a":514},"Um aplicativo Replit publicado é seguro por padrão?","Não existe padrão que o torne seguro nem padrão que o torne inseguro. 2.789 dos 3.042 aplicativos que escaneamos tiraram A. Os que não tiraram tinham um achado que veio do que foi construído: uma rota no próprio servidor que respondia sem login, uma chave no código baixado ou um arquivo privado em um endereço público. Nada na hospedagem produziu um D ou um F.",{"q":516,"a":517},"Qual é o problema de segurança mais comum em aplicativos Replit?","Deixando de lado os cabeçalhos, que faltam em quase todo aplicativo de todo builder, é uma rota de API que responde a um estranho com dados. 1.050 dos 3.037 aplicativos Replit em que essa verificação conseguiu responder tinham pelo menos uma. Um aplicativo Replit costuma carregar o próprio servidor, então tem rotas próprias para deixar abertas, onde um aplicativo Lovable em geral não tem.","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",[520,521,522,523,524,525,526],"o replit é seguro","replit segurança","aplicativo replit seguro","segurança aplicativo replit","aplicativos replit são seguros","segurança deploy replit","is replit safe",{},true,"\u002Fblog\u002Fis-replit-safe","2026-09-15",{"title":5,"description":499},"blog\u002Fis-replit-safe",[534,535,536],"O Replit é seguro? Como host, não era onde os achados estavam. Cada um dos nove aplicativos de 3.042 com nota D ou F chegou lá por algo dentro do próprio aplicativo.","O achado típico do Replit é uma API própria: 1.050 de 3.037 aplicativos tinham uma rota que entregava dados a um estranho sem login, porque um aplicativo Replit costuma sair com o próprio servidor.","De 219 aplicativos com algo em forma de chave no código baixado, três guardavam uma chave que cobra de uma conta. 2.789 dos 3.042 tiraram A.","DENsu6xjf6RjGn6ieovZ2UWxYmJLgiluqMCZmD4434A",[539,546,552,558,564,570,576,582,588,589,595,601,607,613,619,625,631,637,643,649,654,660,666,672,677,683,689,695,701,706,712,718,724,729,735,740,744,750,756,762,767,773],{"path":540,"title":541,"description":542,"published":543,"category":544,"image":545,"draft":500},"\u002Fblog\u002Fsupabase-backup-auth-users","Por que seu dump do Supabase não tem usuários dentro","Rode supabase db dump sozinho e você recebe a forma do seu banco e nenhuma das linhas dele, sem o schema auth onde seus usuários moram.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":547,"title":548,"description":549,"published":550,"category":496,"image":551,"draft":500},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domínio expirado, site fora do ar: o que acontece agora","Seu domínio expirou e seu site está fora do ar. O relógio que começa a correr, por que o certificado é o problema menor, e como conferir os dois.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":553,"title":554,"description":555,"published":556,"category":496,"image":557,"draft":500},"\u002Fblog\u002Fis-lovable-safe","O Lovable é seguro? O que vimos em 18.554 aplicativos Lovable","O Lovable é seguro? Passamos 18.554 aplicativos Lovable no ar por nove verificações. A plataforma foi a mais limpa de cinco. Os achados estavam nos aplicativos.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":559,"title":560,"description":561,"published":562,"category":496,"image":563,"draft":500},"\u002Fblog\u002Fvibe-coded-app-security-checklist","O checklist de segurança do vibe coding, em nove verificações","Um checklist de segurança do vibe coding com nove itens, cada um verificável no seu app de fora por qualquer pessoa, e cada um com um teste de uma linha.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":565,"title":566,"description":567,"published":568,"category":496,"image":569,"draft":500},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Uma chave secreta da Stripe no frontend pode mover dinheiro","Uma chave secreta da Stripe exposta no seu frontend pode reembolsar, cobrar e ler cada ficha de cliente que você tem. Sua chave pk_live_ é que deve estar aí.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":571,"title":572,"description":573,"published":574,"category":496,"image":575,"draft":500},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variáveis de ambiente do Vite expostas: o prefixo diz publique isto","Variáveis de ambiente do Vite expostas no seu app: fizeram o que o prefixo pediu. VITE_ e NEXT_PUBLIC_ significam publique isto, e a IA nunca soube o custo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":577,"title":578,"description":579,"published":580,"category":496,"image":581,"draft":500},"\u002Fblog\u002Fbase44-source-maps","Segurança no Base44: o que um scan aponta e o que é seu para corrigir","Segurança no Base44 em 5.438 apps escaneados: três achados em quase todos são da plataforma, o source map é o selo do Base44, e a sua parte é uma lista curta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":583,"title":584,"description":585,"published":586,"category":496,"image":587,"draft":500},"\u002Fblog\u002Fis-cursor-ai-safe","O Cursor AI é seguro? O editor, o código e o app que você publicou","O Cursor AI é seguro? Três perguntas em uma busca: o que o Cursor guarda, o que o código que ele escreve erra, e se o app que você publicou está aberto.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":529,"title":5,"description":499,"published":530,"category":496,"image":518,"draft":500},{"path":590,"title":591,"description":592,"published":593,"category":544,"image":594,"draft":500},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: sua cópia do banco não tem nenhum arquivo","Um Supabase storage backup é uma tarefa à parte. Os backups do banco guardam a lista dos seus arquivos e nenhum deles, então cada upload fica quebrado.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":596,"title":597,"description":598,"published":599,"category":544,"image":600,"draft":500},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery do Supabase: preço e limites","O point-in-time recovery do Supabase rebobina seu banco para qualquer segundo da última semana. Custa $100 por mês além do Pro e cobre só o banco.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":602,"title":603,"description":604,"published":605,"category":544,"image":606,"draft":500},"\u002Fblog\u002Fsupabase-project-paused-recover","Projeto Supabase pausado? Seus dados continuam lá","O Supabase pausou seu projeto depois de uma semana sem atividade. Nada foi apagado, Restaurar fica ao lado do nome e você tem um ano antes disso mudar.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":608,"title":609,"description":610,"published":611,"category":496,"image":612,"draft":500},"\u002Fblog\u002Fsafest-ai-app-builder","Qual builder de apps com IA é mais seguro? 30.998 apps testados","Qual builder de apps com IA é mais seguro? Escaneamos 30.998 apps no ar do Lovable, Base44, Replit, v0 e Bolt. O builder não é o que decide sua nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":614,"title":615,"description":616,"published":617,"category":496,"image":618,"draft":500},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Ative Row Level Security em toda tabela do Supabase e comprove","Ativar Row Level Security no Supabase sem política fecha a tabela por completo. Uma política sem a chave ligada não faz nada. Aqui está o SQL, e o teste.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":620,"title":621,"description":622,"published":623,"category":496,"image":624,"draft":500},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": o que o aviso não vê","O Supabase marca \"RLS disabled in public\" como erro. Ele não diz nada sobre a política de leitura que deixa a sua tabela igualmente aberta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":626,"title":627,"description":628,"published":629,"category":496,"image":630,"draft":500},"\u002Fblog\u002Frotate-supabase-service-role-key","Como rotacionar uma chave service_role do Supabase vazada","O Supabase manda fechar o vazamento primeiro. Outros guias mandam rotacionar agora. O que vale depende de para onde a sua chave service_role vazou.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":632,"title":633,"description":634,"published":635,"category":496,"image":636,"draft":500},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de segurança para vibe coding comparados, o nosso incluído","O melhor scanner de segurança para vibe coding depende de três perguntas que nenhuma lista de recursos responde. Dez ferramentas comparadas, com preços.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":638,"title":639,"description":640,"published":641,"category":496,"image":642,"draft":500},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: faça você mesmo as cinco verificações","Um Supabase security checker lê o seu app publicado em vez das configurações do projeto. Aqui estão as cinco verificações e como fazer cada uma sozinho.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":644,"title":645,"description":646,"published":647,"category":496,"image":648,"draft":500},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de segurança para vibe coding: o que ele não vê","Um scanner de segurança para vibe coding lê seu app no ar, de fora. O que isso cobre, as quatro coisas que ele não consegue ver e como ler o resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":250,"title":650,"description":651,"published":652,"category":496,"image":653,"draft":500},"Cabeçalhos de segurança faltando: quando isso importa","Cabeçalhos de segurança faltando é o achado que nosso scanner mais imprime. Contra o que eles protegem e quando são a linha menos urgente do relatório.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":655,"title":656,"description":657,"published":658,"category":496,"image":659,"draft":500},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Sua chave de API da OpenAI está exposta no frontend. Troque-a.","Uma chave de API da OpenAI exposta no frontend não pode ser presa a um domínio. Troque-a hoje, mova a chamada para o seu servidor e limite o gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":661,"title":662,"description":663,"published":664,"category":496,"image":665,"draft":500},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Chave de API exposta no frontend: o que 30.998 apps entregam","Uma chave de API exposta no seu frontend costuma ser uma chave do Google Maps. Escaneamos 30.998 apps vibe-coded e contamos quais segredos vazam de verdade.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":667,"title":668,"description":669,"published":670,"category":544,"image":671,"draft":500},"\u002Fblog\u002Fsupabase-backup-tools-compared","Ferramentas de backup do Supabase comparadas, a nossa incluída","Quatro tipos de ferramenta de backup do Supabase, o que cada uma copia de verdade e quando uma GitHub Action gratuita ganha de pagar, nós inclusive.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":320,"title":673,"description":674,"published":675,"category":496,"image":676,"draft":500},"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.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":678,"title":679,"description":680,"published":681,"category":544,"image":682,"draft":500},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups do plano gratuito do Supabase: como fazer sem terminal","No plano gratuito do Supabase não existe backup nenhum: a cópia é você que faz. Como fazer uma pelo painel e o que a rota do CSV deixa para trás.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":496,"image":688,"draft":500},"\u002Fblog\u002Fis-supabase-secure","O Supabase é seguro? É. Seu projeto é outra pergunta","O Supabase é seguro? A plataforma é auditada, criptografada e passa por pentests. A documentação deles diz onde isso termina e começam suas configurações.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":496,"image":694,"draft":500},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Onde ficam as chaves de API do Supabase: anon, service_role e URL","A URL do projeto, a chave anon e a chave service_role ficam todas numa página do painel. Aqui está onde ela fica, e qual dos quatro valores vai no seu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":699,"category":496,"image":700,"draft":500},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy no Supabase. E agora?","\"New row violates row-level security policy\" significa que o Supabase recusou uma escrita. O conserto rápido reabre a tabela para qualquer um.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":298,"title":702,"description":703,"published":704,"category":496,"image":705,"draft":500},"Um curinga CORS é um risco de segurança? Quase nunca.","Um curinga CORS é um risco de segurança? Em geral é o padrão do seu builder e não entrega nada que o seu servidor já não desse a qualquer um que pedisse.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":707,"title":708,"description":709,"published":710,"category":544,"image":711,"draft":500},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching do Supabase não é backup. Ele só anda para a frente.","Por que o branching do Supabase não é backup: um branch começa sem os seus dados e um merge só leva o esquema. Para que ele serve e o que usar no lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":713,"title":714,"description":715,"published":716,"category":544,"image":717,"draft":500},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Como restaurar um backup do Supabase, e o que quebra depois","Como restaurar um backup do Supabase pelo painel ou por um arquivo de dump, o que a restauração substitui e por que o seu app pode continuar quebrado no fim.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":719,"title":720,"description":721,"published":722,"category":496,"image":723,"draft":500},"\u002Fblog\u002Fsupabase-storage-bucket-public","Seu bucket do Supabase Storage é público. Isso é um problema?","Um bucket público do Supabase Storage significa que quem tem a URL de um arquivo pode abri-lo. Não significa que alguém possa listar o que está lá dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":309,"title":725,"description":726,"published":727,"category":496,"image":728,"draft":500},"Uma chave de API do Google no frontend é um problema?","Uma chave de API do Google exposta no seu frontend é a chave que nosso scanner mais encontra, e quase sempre está tudo bem. Um ajuste gratuito decide isso.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":730,"title":731,"description":732,"published":733,"category":544,"image":734,"draft":500},"\u002Fblog\u002Fai-agent-deleted-my-database","Um agente de IA apagou meus dados do Supabase. O que eu recupero?","Um agente de IA apagou dados do seu banco. O que você recupera já estava decidido antes de ele rodar, e os próximos minutos decidem o resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":290,"title":736,"description":737,"published":738,"category":496,"image":739,"draft":500},"Qualquer um consegue ler seu banco Supabase? Testamos 3.680 apps","Qualquer um consegue ler seu banco de dados Supabase sem fazer login? Escaneamos 30.998 apps no ar criadas com builders de IA e medimos quantas dizem que sim.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":342,"title":741,"description":742,"published":738,"category":496,"image":743,"draft":500},"Source maps expostos: seu app está publicando o código original","Um source map exposto deixa qualquer um ler o código original do seu app, comentários incluídos. A verificação de 30 segundos e o que importa de verdade.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":745,"title":746,"description":747,"published":748,"category":496,"image":749,"draft":500},"\u002Fblog\u002Fsupabase-new-api-keys","As novas chaves de API do Supabase: qual vai no seu app?","O Supabase trocou anon e service_role por chaves publicáveis e secretas. Qual delas pertence ao seu app e qual nunca deve estar lá?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":751,"title":752,"description":753,"published":754,"category":544,"image":755,"draft":500},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","O Supabase faz backup do meu banco de dados? Depende do plano.","O Supabase faz backup do seu banco de dados? Todo dia nos planos pagos, e nada no gratuito. Como descobrir o que você tem e o que essa cópia não cobre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":757,"title":758,"description":759,"published":760,"category":496,"image":761,"draft":500},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","O Supabase Row Level Security está ligado. A tabela continua pública.","Ligar o Supabase Row Level Security não protege uma tabela. Quem protege são as políticas, e a que consertou o seu app pode deixar qualquer um entrar.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":763,"title":764,"description":765,"published":760,"category":544,"image":766,"draft":500},"\u002Fblog\u002Fversion-history-is-not-a-backup","O histórico de versões não é backup. Ele não desfaz um delete.","Lovable e Bolt guardam um histórico de versões do seu código. Seu banco de dados é um serviço à parte, e voltar atrás não traz os seus dados de volta.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":768,"title":769,"description":770,"published":771,"category":544,"image":772,"draft":500},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Três formas de fazer backup de um banco Supabase, e o que falta","O painel, o pg_dump e um serviço gerenciado. O que cada um salva de verdade, o que deixa de fora sem avisar e qual sobrevive a perder a conta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":774,"title":775,"description":776,"published":771,"category":496,"image":777,"draft":500},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quais chaves de API são seguras no navegador e quais não são","Sua chave anon do Supabase foi feita para ser pública. Sua chave service_role não, e ela ignora todas as regras que você criar. Como diferenciar as duas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150954269]