[{"data":1,"prerenderedAt":1055},["ShallowReactive",2],{"blog-pt-certificate-not-trusted":3,"blog-index-pt":524},{"id":4,"title":5,"body":6,"category":482,"cover":483,"coverAlt":484,"description":485,"draft":486,"extension":487,"faq":488,"image":504,"keywords":505,"meta":513,"navigation":514,"ogTitle":5,"path":515,"published":516,"seo":517,"stem":518,"tldr":519,"updated":516,"__hash__":523},"blog_pt\u002Fblog\u002Fcertificate-not-trusted.md","Certificado não confiável: três causas além do vencimento",{"type":7,"value":8,"toc":468},"minimark",[9,13,16,25,30,33,36,39,131,134,137,141,144,156,186,189,200,204,207,210,238,244,247,251,254,257,260,263,267,270,273,276,281,299,303,306,309,334,339,342,360,364,367,370,377,385,389,392,400,411,420,431,435,460],[10,11,12],"p",{},"Ontem o seu aplicativo carregava sem problema. Hoje alguém manda um print de um\naviso do navegador em tela cheia, dizendo que a conexão não é particular, e\npergunta se o seu site foi invadido. Você abre o certificado e ele vale até a\npróxima primavera. Não venceu, e mesmo assim o navegador diz que o certificado não\né confiável.",[10,14,15],{},"O caminho óbvio é renovar, e para essa tela ele é o errado. Cada uma das três\ncausas abaixo acontece com um certificado que já está dentro da validade, então\numa renovação dá a você uma data de vencimento mais distante num certificado que\ncontinua recusado por outro motivo.",[10,17,18,19,24],{},"No ",[20,21,23],"a",{"href":22},"\u002Fblog\u002Fdomain-and-certificate-expiry","nosso post sobre vencimento",", o\ncertificado é o alvará na vitrine dizendo que esta loja é mesmo a da placa. O\nnavegador de um visitante lê três coisas nesse alvará antes de deixar alguém\nentrar: a data, o nome da loja para a qual ele foi emitido e a assinatura de\nquem o emitiu. O vencimento é a data. Este artigo trata das outras duas.",[26,27,29],"h2",{"id":28},"certificado-não-confiável-sem-ter-vencido-por-quê","Certificado não confiável sem ter vencido: por quê?",[10,31,32],{},"Porque o nome ou a assinatura falhou, e o navegador ergue o mesmo muro para cada\numa das verificações dele.",[10,34,35],{},"Um certificado só é confiável se cita exatamente o endereço que está na barra do\nvisitante e foi assinado por uma autoridade em que o navegador já confia, com\ncada certificado intermediário enviado junto. Se qualquer um dos dois falha, o\nChrome mostra o aviso de que a conexão não é particular e o Firefox o de um\npossível risco de segurança, exatamente como num vencido.",[10,37,38],{},"O que muda são as letras miúdas embaixo do aviso. Leia antes de mexer em\nqualquer coisa:",[40,41,42,61],"table",{},[43,44,45],"thead",{},[46,47,48,52,55,58],"tr",{},[49,50,51],"th",{},"O que o Chrome mostra",[49,53,54],{},"O que diz a explicação do Firefox",[49,56,57],{},"O que significa",[49,59,60],{},"O que resolve",[62,63,64,82,98,113],"tbody",{},[46,65,66,73,76,79],{},[67,68,69],"td",{},[70,71,72],"code",{},"NET::ERR_CERT_COMMON_NAME_INVALID",[67,74,75],{},"O certificado não é válido para o seu endereço",[67,77,78],{},"Ele foi emitido para outro nome",[67,80,81],{},"Um certificado que liste exatamente o seu endereço",[46,83,84,89,92,95],{},[67,85,86],{},[70,87,88],{},"NET::ERR_CERT_AUTHORITY_INVALID",[67,90,91],{},"O certificado não é confiável porque é autoassinado",[67,93,94],{},"Ninguém responde por ele além do próprio servidor",[67,96,97],{},"Um certificado de uma autoridade de verdade",[46,99,100,104,107,110],{},[67,101,102],{},[70,103,88],{},[67,105,106],{},"O emissor do certificado é desconhecido",[67,108,109],{},"O navegador não consegue ligá-lo a nenhuma autoridade confiável",[67,111,112],{},"A cadeia completa, de uma autoridade reconhecida",[46,114,115,120,123,126],{},[67,116,117],{},[70,118,119],{},"NET::ERR_CERT_DATE_INVALID",[67,121,122],{},"O certificado venceu",[67,124,125],{},"A data",[67,127,128],{},[20,129,130],{"href":22},"Um certificado novo",[10,132,133],{},"O Chrome mostra o mesmo código para a segunda e a terceira linha, e é por isso\nque vale a pena abrir o próprio certificado.",[10,135,136],{},"Se só uma pessoa avisou e mais ninguém vê o problema, pergunte em que rede ela\nestava. O código-fonte do Chrome cita uma rede wifi que manda os usuários para\numa página de login como uma das causas do erro de nome. Essa some assim que a\npessoa entra na rede.",[26,138,140],{"id":139},"como-vejo-o-que-o-certificado-diz","Como vejo o que o certificado diz?",[10,142,143],{},"Abra o certificado a partir do aviso e leia dois campos: para quem ele foi\nemitido e quem o emitiu.",[10,145,146,147,151,152,155],{},"No Chrome, clique na indicação de alerta à esquerda da barra de endereço (",[148,149,150],"strong",{},"Not\nsecure"," num Chrome em inglês) e abra o certificado pelo painel que aparece. No\nFirefox, clique em ",[148,153,154],{},"Advanced"," no aviso e depois no link para o certificado do\nsite (são esses os nomes num Firefox em inglês). Os dois navegadores chamam os\nmesmos campos de jeitos diferentes:",[157,158,159,175],"ul",{},[160,161,162,163,166,167,170,171,174],"li",{},"O campo que diz para quem o certificado foi emitido (",[148,164,165],{},"Issued To"," num Chrome\nem inglês, ",[148,168,169],{},"Subject Name"," no Firefox) traz o nome para o qual ele foi feito.\nA lista completa de nomes que ele cobre fica em ",[148,172,173],{},"Subject Alternative Name",",\ne é essa lista que o navegador compara com o endereço.",[160,176,177,178,181,182,185],{},"O campo que diz quem o emitiu (",[148,179,180],{},"Issued By"," no Chrome, ",[148,183,184],{},"Issuer Name"," no\nFirefox) traz a autoridade que o assinou.",[10,187,188],{},"Cada uma das três causas aparece de um jeito ali:",[157,190,191,194,197],{},[160,192,193],{},"O certificado cita outro endereço. É a causa 1.",[160,195,196],{},"Titular e emissor têm o mesmo nome. Ele assinou a si mesmo: é a causa 2.",[160,198,199],{},"Ele cita o seu endereço, o emissor é uma autoridade de que você já ouviu\nfalar, e o navegador recusa assim mesmo. É a causa 3, a cadeia.",[26,201,203],{"id":202},"causa-1-o-certificado-é-de-outro-endereço","Causa 1: o certificado é de outro endereço",[10,205,206],{},"O certificado é autêntico e está na validade, e foi emitido para outro nome. É o\nalvará de outra loja, pendurado na sua vitrine.",[10,208,209],{},"Ele aparece de três formas:",[157,211,212,218,232],{},[160,213,214,217],{},[148,215,216],{},"Seu domínio aponta para uma hospedagem que ainda não tem certificado para\nele."," A hospedagem responde com o certificado que tem, emitido para um nome\ndela. A documentação da Lovable diz isso com todas as letras: até o\ncertificado ficar pronto, o navegador mostra um aviso de segurança no lugar\ndo seu site.",[160,219,220,223,224,227,228,231],{},[148,221,222],{},"O certificado cobre uma grafia do seu endereço e o visitante digitou a\noutra."," ",[70,225,226],{},"www.yourapp.com"," e ",[70,229,230],{},"yourapp.com"," são dois nomes para um\ncertificado, e cada um precisa estar na lista dele.",[160,233,234,237],{},[148,235,236],{},"Uma parte do seu DNS ainda aponta para um lugar que você deixou."," Uma\nhospedagem antiga, ou a página de estacionamento que o seu registrador\nmostrava antes de você conectar qualquer coisa, responde nesse nome com um\ncertificado próprio.",[239,240],"diagram",{"alt":241,"caption":242,"src":243},"Duas linhas. Em cada uma, uma barra de endereço com yourapp.com fica ao lado de um cartão de certificado que lista os nomes cobertos. Em cima, o cartão lista só www.yourapp.com e a linha termina num X. Embaixo, lista os dois nomes e a linha termina num sinal de certo.","Para um certificado, o endereço com www e o sem www são dois nomes. O endereço da barra precisa estar na lista.","\u002Fblog\u002Fcertificate-not-trusted\u002Fone-name-missing-1600x660.png",[10,245,246],{},"Na Lovable e na Vercel, você não compra nem instala esse certificado. A\nhospedagem emite um para cada nome que você adiciona nas configurações de\ndomínio dela, depois que o seu DNS aponta esse nome para ela. A documentação da\nLovable acrescenta que a hospedagem dela não usa de forma alguma um certificado\ncomprado no seu registrador. Adicione as duas grafias, aponte as duas para a\nhospedagem e espere cada uma aparecer como ativa.",[26,248,250],{"id":249},"causa-2-o-certificado-assinou-a-si-mesmo","Causa 2: o certificado assinou a si mesmo",[10,252,253],{},"Ninguém responde por esse certificado além do servidor que o apresenta. É um\nalvará que o lojista imprimiu em casa.",[10,255,256],{},"Todo navegador recusa um desses num site público, e é para recusar mesmo. Um\ncomentário no código-fonte do Chrome dá o motivo em uma linha: um certificado\nautoassinado não oferece nenhuma defesa contra um atacante posicionado entre o\nseu visitante e o seu aplicativo.",[10,258,259],{},"Ele aparece em servidores que alguém configurou à mão: um servidor alugado, uma\nferramenta auto-hospedada, uma configuração de teste que foi para produção junto\ncom o aplicativo. Um builder emite certificados de verdade para os domínios que\nvocê adiciona nele. Um certificado autoassinado num aplicativo hospedado por um\nbuilder significa, então, que outra coisa que não o builder está respondendo no\nseu endereço. Confira para onde o seu DNS aponta antes de mudar qualquer outra\ncoisa.",[10,261,262],{},"A solução é um certificado de uma autoridade de verdade. O Let's Encrypt emite\nde graça, e é a autoridade que a Vercel usa quando emite o seu.",[26,264,266],{"id":265},"causa-3-um-elo-da-cadeia-nunca-foi-enviado","Causa 3: um elo da cadeia nunca foi enviado",[10,268,269],{},"O certificado é do seu endereço e foi assinado por uma autoridade de verdade,\nmas o servidor o mandou sem o certificado intermediário, então o navegador não\nconsegue ligá-lo a ninguém em quem confia. O alvará foi assinado por uma filial,\ne falta na vitrine a carta da matriz que responde por essa filial.",[10,271,272],{},"A Mozilla chama um certificado intermediário faltando de um dos problemas de\nconfiguração de servidor mais comuns. O Firefox agora baixa com antecedência uma\ncópia de cada certificado intermediário confiável, para que os usuários dele\nparem de dar com o erro.",[10,274,275],{},"É isso que torna essa causa difícil de ver: no seu notebook pode estar tudo\ncerto enquanto para outra pessoa falha. Um navegador que tem a própria cópia do\nelo que falta preenche o buraco. Um software que usa só o que o seu servidor\nenvia não tem com que preencher. O nosso scanner é esse tipo de software, e por\nisso ele pode apontar um certificado como não confiável enquanto o seu navegador\nmostra um cadeado.",[239,277],{"alt":278,"caption":279,"src":280},"Um servidor envia um certificado a dois visitantes. Entre o certificado e a autoridade confiável deveria haver um segundo certificado, e o servidor não o enviou. O primeiro visitante tem uma cópia do certificado que falta e recebe um sinal de certo. O segundo não tem nada e recebe um X.","A mesma cadeia incompleta, enviada a dois visitantes. Só quem já tinha o elo que falta consegue completá-la.","\u002Fblog\u002Fcertificate-not-trusted\u002Fthe-missing-link-1600x700.png",[10,282,283,284,287,288,291,292,298],{},"Num builder, é ele quem cuida da cadeia. Ela falta em servidores configurados\nà mão, e ali a solução é servir o certificado seguido do certificado\nintermediário, num único arquivo. Se você usa o certbot do Let's Encrypt, esse\narquivo é o ",[70,285,286],{},"fullchain.pem",", e o erro é apontar o servidor para o ",[70,289,290],{},"cert.pem"," no\nlugar dele. Para conferir de fora,\n",[20,293,297],{"href":294,"rel":295},"https:\u002F\u002Fwww.ssllabs.com\u002Fssltest\u002F",[296],"nofollow","o teste de servidor gratuito do SSL Labs","\nmostra um certificado intermediário faltando como um problema na cadeia.",[26,300,302],{"id":301},"o-caso-do-domínio-próprio-em-ordem","O caso do domínio próprio, em ordem",[10,304,305],{},"Quando você conecta o seu próprio domínio a um builder, os visitantes veem esse\naviso até a hospedagem ter um certificado para o seu nome, e o aviso está\ndizendo a verdade. Ele acaba sozinho quando o certificado é emitido.",[10,307,308],{},"A ordem, na Lovable:",[310,311,312,321,324,327],"ol",{},[160,313,314,315,317,318,320],{},"Adicione o domínio na Lovable. Ela configura ",[70,316,230],{}," e\n",[70,319,226],{}," e lista cada um separadamente.",[160,322,323],{},"Troque os registros DNS no seu registrador pelos valores que a Lovable\npassar. Segundo a Lovable, a maior parte das mudanças fica ativa em poucas\nhoras, e a propagação pode levar até 72.",[160,325,326],{},"A Lovable verifica o domínio e emite o certificado. A Vercel funciona do\nmesmo jeito: prova ao Let's Encrypt que o nome é seu, automaticamente,\ndesde que o domínio aponte para a Vercel.",[160,328,329,330,333],{},"Abra o site quando o domínio aparecer como ",[148,331,332],{},"Live",", que é o que a própria\nLovable recomenda.",[239,335],{"alt":336,"caption":337,"src":338},"Uma linha do tempo. Uma figura aponta um nome para uma hospedagem, e dali um trecho âmbar com um sinal de alerta vai até um selo que marca a emissão do certificado. Depois a linha passa para a cor de destaque, com um cadeado. Uma marca mais adiante traz o número 72.","Entre apontar o seu domínio para a hospedagem e a chegada do certificado, o aviso está certo. A Lovable pede que você fale com o suporte se ele continuar lá depois de 72 horas.","\u002Fblog\u002Fcertificate-not-trusted\u002Fthe-wait-is-the-warning-1600x560.png",[10,340,341],{},"Se o aviso ainda estiver lá depois de 72 horas, a Lovable pede que você fale\ncom o suporte dela. Duas configurações valem uma conferida antes de escrever:",[157,343,344,354],{},[160,345,346,349,350,353],{},[148,347,348],{},"Procure um registro CAA."," É uma entrada de DNS que diz quais autoridades\npodem emitir certificados para o seu domínio. Uma que deixa de fora a\nautoridade da sua hospedagem bloqueia o certificado, e um subdomínio herda os\nregistros CAA do domínio pai quando não tem os próprios.\n",[20,351,352],{"href":22},"O post sobre vencimento"," encontra o\nmesmo registro como motivo de uma renovação falhar. Aqui ele impede que o\nprimeiro certificado chegue a ser emitido.",[160,355,356,359],{},[148,357,358],{},"Procure um proxy na frente."," Se o seu DNS está na Cloudflare com a nuvem\nlaranja ligada nos registros que a sua hospedagem passou, quem responde é a\nCloudflare, e não a sua hospedagem. A Lovable diz que aí não consegue\nverificar o domínio nem emitir certificados para ele, e tanto a Lovable quanto\na Vercel dizem para colocar esses registros em DNS only.",[26,361,363],{"id":362},"o-que-encontramos-em-30879-aplicativos","O que encontramos em 30.879 aplicativos",[10,365,366],{},"Oito tinham um certificado em que nenhum navegador confiaria, e todos estavam\nnum domínio que o dono tinha conectado.",[10,368,369],{},"Em agosto de 2026 o nosso scan leu o certificado de 30.879 aplicativos no ar:\n29.927 no subdomínio do próprio builder e 952 num domínio próprio. Os oito\ncertificados não confiáveis estavam todos entre os 952, um pouco menos de um em\ncada cem. Nenhum dos aplicativos no subdomínio de um builder tinha um, o que bate\ncom tudo o que vem acima. No endereço do próprio builder, o nome e o certificado\nsão do builder.",[10,371,372,373,376],{},"O nosso achado registra que o certificado falhou, mas não qual das três causas\nfoi, então não temos como dizer como os oito se dividem. Os certificados\nvencidos ou perto de vencer do mesmo scan estão contados no\n",[20,374,375],{"href":22},"post sobre vencimento",".",[10,378,379,380,384],{},"Para conferir o seu próprio aplicativo, ",[20,381,383],{"href":382},"\u002Fsecurity-scanner","o nosso scan gratuito","\nlê de fora o certificado que o seu servidor envia e aponta esse achado quando o\nencontra. Leva cerca de 20 segundos e não pede conta.",[26,386,388],{"id":387},"ficar-sabendo-da-próxima-vez-que-algo-mudar","Ficar sabendo da próxima vez que algo mudar",[10,390,391],{},"Um certificado passa de confiável a recusado quando alguma coisa muda em volta\ndele: um domínio novo, uma mudança de DNS, um proxy ligado. A verificação que\nimporta é a que roda depois da mudança.",[10,393,394,399],{},[148,395,396],{},[20,397,398],{"href":382},"Escaneie o seu aplicativo de graça"," para ver o que o\nnavegador de um visitante recebe hoje.",[157,401,402,405,408],{},[160,403,404],{},"Lê de fora o certificado que o seu servidor envia, junto com outras oito\nverificações.",[160,406,407],{},"Aponta o achado quando o certificado não é confiável, e quando venceu ou está\nperto de vencer.",[160,409,410],{},"Cerca de 20 segundos, e sem conta.",[10,412,413,419],{},[148,414,415],{},[20,416,418],{"href":417},"\u002Fwebsite-monitoring","Reeve Monitor"," para saber logo depois da mudança.",[157,421,422,425,428],{},[160,423,424],{},"Verifica o seu aplicativo a cada 60 segundos, e um certificado em que ele não\npode confiar conta como o seu aplicativo fora do ar. Você fica sabendo, então,\ncomo ficaria de qualquer outra queda.",[160,426,427],{},"Roda as nove verificações de novo a cada hora e manda um e-mail quando a sua\nnota cai.",[160,429,430],{},"Cobre até três aplicativos.",[26,432,434],{"id":433},"o-que-fazer-agora","O que fazer agora",[436,437,438],"key-takeaways",{},[157,439,440,443,446,454,457],{},[160,441,442],{},"Leia o código embaixo do aviso antes de renovar qualquer coisa. Um erro de data pede um certificado novo. Um erro de nome ou de autoridade pede outra coisa.",[160,444,445],{},"Abra o certificado e compare o nome para o qual ele foi emitido com o endereço da barra, e com o nome de quem o emitiu.",[160,447,448,449,227,451,453],{},"Num builder, adicione ",[70,450,230],{},[70,452,226],{}," nas configurações de domínio e aponte os dois para ele.",[160,455,456],{},"Se um domínio novo ainda mostra o aviso depois de 72 horas, procure um registro CAA ou um proxy na frente da hospedagem antes de falar com o suporte.",[160,458,459],{},"Num servidor que você mesmo administra, sirva a cadeia completa e confira de fora com o SSL Labs.",[10,461,462,463,467],{},"Quando o aviso some e o aplicativo continua sem carregar, a próxima pergunta é\nse o problema é o seu aplicativo ou a plataforma embaixo dele, e\n",[20,464,466],{"href":465},"\u002Fblog\u002Fis-supabase-down-or-your-app","o Supabase caiu ou é o seu aplicativo?","\nmostra como diferenciar.",{"title":469,"searchDepth":470,"depth":470,"links":471},"",3,[472,474,475,476,477,478,479,480,481],{"id":28,"depth":473,"text":29},2,{"id":139,"depth":473,"text":140},{"id":202,"depth":473,"text":203},{"id":249,"depth":473,"text":250},{"id":265,"depth":473,"text":266},{"id":301,"depth":473,"text":302},{"id":362,"depth":473,"text":363},{"id":387,"depth":473,"text":388},{"id":433,"depth":473,"text":434},"Noções de segurança","\u002Fblog\u002Fcertificate-not-trusted\u002Fcover-1200x630.png","Cartão de certificado com selo e data na cor de destaque, sob uma barra de endereço com um nome mais longo que o do cartão.","Certificado não confiável mesmo com a data certa? Ele cita outro endereço, assinou a si mesmo ou falta um elo na cadeia. Veja como saber qual.",false,"md",[489,492,495,498,501],{"q":490,"a":491},"Por que meu site diz que a conexão não é particular se meu certificado não venceu?","Porque a data é só uma das três coisas que um navegador confere, e as outras duas falham por conta própria. O certificado também precisa citar exatamente o endereço que o visitante digitou, e ser assinado por uma autoridade em que o navegador confia, com cada certificado intermediário enviado junto. Um certificado que falha em qualquer uma das duas verificações recebe o mesmo aviso de tela cheia de um vencido, e renovar não muda nada.",{"q":493,"a":494},"O que é um erro de nome do certificado?","Um certificado emitido para um endereço e apresentado em outro. O Chrome mostra NET::ERR_CERT_COMMON_NAME_INVALID e o Firefox diz que o certificado não é válido para o seu endereço. O certificado em si costuma ser autêntico e estar na validade. Ele só pertence a outro nome, muitas vezes o da sua hospedagem, e é isso que uma hospedagem apresenta no seu domínio antes de ter emitido um para você.",{"q":496,"a":497},"Por que com www funciona e o domínio sem www não?","Porque, para um certificado, são dois nomes diferentes. Ou o certificado lista só um deles, ou o DNS do outro ainda aponta para outro lugar, como a página de estacionamento do seu registrador ou uma hospedagem antiga, que responde com um certificado próprio. A Lovable conecta os dois e lista cada um separadamente, então confira se os dois aparecem como ativos.",{"q":499,"a":500},"Quanto tempo leva o certificado de um domínio próprio?","Segundo a Lovable, a configuração de um domínio costuma terminar em poucos minutos mas pode levar várias horas, mudanças de DNS podem levar até 72 horas para se propagar, e é para falar com o suporte dela se o certificado não tiver sido emitido depois de 72 horas. Até ele ser emitido, os visitantes veem um aviso de segurança no lugar do seu site.",{"q":502,"a":503},"Um certificado autoassinado serve em algum caso?","No seu próprio computador, para desenvolver, sim. Num site que o público visita, não. O navegador de cada visitante recusa, e um comentário no código-fonte do Chrome registra que um certificado autoassinado não oferece nenhuma defesa contra um atacante posicionado entre o visitante e o site.","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",[506,507,508,509,510,511,512],"certificado não confiável","certificado ssl não confiável navegador","sua conexão não é particular domínio próprio","nome do certificado não corresponde","certificado autoassinado aviso site","net::err_cert_common_name_invalid","net::err_cert_authority_invalid",{},true,"\u002Fblog\u002Fcertificate-not-trusted","2026-10-26",{"title":5,"description":485},"blog\u002Fcertificate-not-trusted",[520,521,522],"Um certificado não confiável para os navegadores pode estar perfeitamente dentro da validade. Ele é recusado porque cita outro endereço, porque assinou a si mesmo ou porque chegou sem o certificado que responde por ele.","A tela de aviso é a mesma de um certificado vencido, e renovar não resolve nenhuma das três causas. O código que aparece embaixo do aviso diz qual você tem.","Na Lovable e na Vercel, um domínio próprio mostra esse aviso até o certificado dele ser emitido. Essa espera é normal. Um aviso que dura mais do que isso significa que alguma coisa está travando o certificado.","vuN5ub0orsXgMOaOZRLrMwDAHz-nFIhRSJMD17McfEM",[525,531,537,543,549,555,561,567,573,579,585,592,598,604,610,611,617,623,629,635,641,647,653,659,665,671,677,683,689,695,701,707,713,719,725,731,737,743,749,755,760,766,772,778,784,790,795,801,807,813,818,824,830,836,842,848,854,860,866,872,878,884,890,896,902,908,914,920,926,932,938,944,950,956,962,968,974,980,986,992,998,1004,1010,1016,1021,1027,1033,1039,1044,1050],{"path":526,"title":527,"description":528,"published":529,"category":482,"image":530,"draft":486},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\", explicado","Supabase \"max client connections reached\": o pooler não tem lugar para mais um cliente. A porta da sua string de conexão define o limite.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":532,"title":533,"description":534,"published":535,"category":482,"image":536,"draft":486},"\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","Erro do Supabase: \"Unsupported provider: provider is not enabled\"","\"Unsupported provider: provider is not enabled\": o Google está desativado no seu projeto Supabase. Como ativar e corrigir o redirect_uri_mismatch.","2026-11-08","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",{"path":538,"title":539,"description":540,"published":541,"category":482,"image":542,"draft":486},"\u002Fblog\u002Fviolates-foreign-key-constraint","Erro do Supabase \"violates foreign key constraint\" ao inserir","Supabase \"insert or update on table violates foreign key constraint\": sua linha aponta para uma linha que não existe. Qual, por quê, e como corrigir.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":544,"title":545,"description":546,"published":547,"category":482,"image":548,"draft":486},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Erro do Supabase \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": uma coluna obrigatória chegou vazia. De onde veio o null, e como corrigir.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":550,"title":551,"description":552,"published":553,"category":482,"image":554,"draft":486},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": para onde foi a sessão","\"Auth session missing!\" é o supabase-js sem achar nenhuma sessão logada e sem chegar a perguntar ao Supabase. Para onde foi a sessão, e a correção.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":556,"title":557,"description":558,"published":559,"category":482,"image":560,"draft":486},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": ninguém está logado","\"invalid claim: missing sub claim\": o Supabase Auth recebeu um token autêntico sem nenhum usuário, a chave do projeto no lugar de uma sessão.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":562,"title":563,"description":564,"published":565,"category":482,"image":566,"draft":486},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": a causa real","\"Failed to send a request to the Edge Function\": o navegador não recebeu uma resposta legível. O console dele diz por quê e se a sua função rodou.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":568,"title":569,"description":570,"published":571,"category":482,"image":572,"draft":486},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","Por que o Supabase redireciona links de e-mail para localhost:3000","Se o Supabase redireciona para localhost:3000, a Site URL nunca foi trocada ou o seu endereço falta em Redirect URLs. A solução, e o curinga a evitar.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":574,"title":575,"description":576,"published":577,"category":482,"image":578,"draft":486},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" num link novo","Num link enviado há um minuto, \"Email link is invalid or has expired\" no Supabase costuma significar que um filtro de e-mail o usou antes. Como resolver.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":580,"title":581,"description":582,"published":583,"category":482,"image":584,"draft":486},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\", explicado","Supabase \"canceling statement due to statement timeout\": uma consulta passou do limite do seu papel, 3 segundos para um visitante. Veja antes a política RLS.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":586,"title":587,"description":588,"published":589,"category":590,"image":591,"draft":486},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" no Supabase, e o que vai junto","\"Database error deleting user\" no Supabase: seu banco recusou a exclusão. O motivo está nos seus logs, e a correção decide o que mais é apagado.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":593,"title":594,"description":595,"published":596,"category":482,"image":597,"draft":486},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" no Supabase","O webhook do Stripe numa Edge Function do Supabase diz \"No signatures found matching the expected signature\"? São duas causas. Continue verificando.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":599,"title":600,"description":601,"published":602,"category":482,"image":603,"draft":486},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" no Supabase: as três causas","O Supabase diz \"Invalid login credentials\" para senha errada, e-mail desconhecido e conta Google. Como saber qual é, e por que é vago.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":605,"title":606,"description":607,"published":608,"category":482,"image":609,"draft":486},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": o erro real","\"Edge Function returned a non-2xx status code\" quer dizer que sua função do Supabase respondeu com um erro. Veja onde ler o erro real.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":515,"title":5,"description":485,"published":516,"category":482,"image":504,"draft":486},{"path":612,"title":613,"description":614,"published":615,"category":482,"image":616,"draft":486},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": leia as aspas","Supabase \"invalid input syntax for type uuid\": seu app enviou algo que não é um id. Leia as aspas, segure a consulta, mantenha a coluna.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":618,"title":619,"description":620,"published":621,"category":482,"image":622,"draft":486},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\", explicado","Supabase \"duplicate key value violates unique constraint\": o valor já está em uso. Ache a coluna, escolha uma correção e tire o valor da tela.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":482,"image":628,"draft":486},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\" e a tabela está lá","Supabase \"relation does not exist\" ou PGRST205: nenhuma tabela tem esse nome nesse schema. Quatro verificações, e o que expor um schema abre.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":630,"title":631,"description":632,"published":633,"category":482,"image":634,"draft":486},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" mostra os nomes de argumentos que seu app enviou. Compare-os com a função.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":636,"title":637,"description":638,"published":639,"category":482,"image":640,"draft":486},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" costuma ser um nome que não bate. Quatro verificações e a linha que recarrega.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":482,"image":646,"draft":486},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": dois limites, um só código","Supabase \"Email Rate Limit Exceeded\" limita cada email que seu projeto envia: 2 por hora no remetente embutido. O que conta e como aumentar.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":482,"image":652,"draft":486},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 causas","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" desconecta seus usuários. Três causas, e como o log do Auth separa cada uma.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":482,"image":658,"draft":486},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": três causas","Supabase \"permission denied for schema public\" é um grant que falta no schema. O que o removeu, e a linha que o devolve.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":482,"image":664,"draft":486},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": as três coisas que isso significa","Supabase \"Bucket not found\" é uma de três coisas: um link público para um bucket privado, um nome que não bate exatamente ou o projeto errado.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":482,"image":670,"draft":486},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: qual chave parou de funcionar?","Um erro Supabase invalid JWT é o PGRST301: um token assinado não passou na verificação. Num projeto novo isso é a sessão, não a chave de API.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":672,"title":673,"description":674,"published":675,"category":482,"image":676,"draft":486},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" quase sempre é nenhuma","O Supabase devolve PGRST116, \"JSON object requested, multiple (or no) rows returned\", quando a consulta não achou nada. Linha escondida parece ausente.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":678,"title":679,"description":680,"published":681,"category":482,"image":682,"draft":486},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" no Supabase: onde olhar","\"Database error saving new user\" quer dizer que algo preso ao seu cadastro no Supabase falhou e tudo foi desfeito. O erro real está nos seus logs.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":482,"image":688,"draft":486},"\u002Fblog\u002Fwhat-is-supabase","O que é Supabase? O banco de dados que seu builder escolheu","O que é Supabase: o banco de dados, o login e o armazenamento de arquivos do seu app. O Supabase cuida dos servidores; as regras das suas linhas são suas.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":693,"category":482,"image":694,"draft":486},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Uma chave AWS exposta no seu frontend não é como uma chave OpenAI","Uma chave de acesso da AWS exposta no seu frontend lê e grava no seu armazenamento. A solução costuma ser uma presigned URL, não uma chave nova.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":696,"title":697,"description":698,"published":699,"category":482,"image":700,"draft":486},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" ao enviar","\"New row violates row-level security policy for table objects\" quer dizer que o seu envio não tem regra insert. Deixar o bucket público não cria nenhuma.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":702,"title":703,"description":704,"published":705,"category":482,"image":706,"draft":486},"\u002Fblog\u002Fbase44-security-scan","Scan de segurança do Base44: o que só ele enxerga","O scan de segurança do Base44 verifica sete tipos de problema por dentro. Esta é a metade que ele lê e mais ninguém, e a metade que ele nunca olha.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":708,"title":709,"description":710,"published":711,"category":482,"image":712,"draft":486},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Sua chave de API vazou. A ordem em que agir","Uma chave de API vazou e você não sabe o que fazer primeiro. Nem toda chave no seu frontend é um vazamento, e a ordem importa mais que a pressa.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":714,"title":715,"description":716,"published":717,"category":482,"image":718,"draft":486},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sem desligar o RLS","\"Infinite recursion detected in policy for relation\" significa que a sua policy perguntou à tabela que ela protege. Veja como quebrar o círculo.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":720,"title":721,"description":722,"published":723,"category":482,"image":724,"draft":486},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" no Supabase, e a correção errada","\"No API key found in request\" significa que sua requisição chegou ao Supabase sem chave. Quase toda resposta aponta para as regras do seu banco.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":726,"title":727,"description":728,"published":729,"category":482,"image":730,"draft":486},"\u002Fblog\u002Fis-base44-safe","O Base44 é seguro? O que vimos em 5.442 apps Base44","O Base44 é seguro? Rodamos nove verificações em 5.442 apps Base44 no ar. Quase todas tiraram B por motivos que o dono nunca escolheu.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":732,"title":733,"description":734,"published":735,"category":482,"image":736,"draft":486},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Esconder uma chave de API: mova para uma Edge Function do Supabase","Esconder uma chave de API é tirá-la do navegador, e uma Edge Function do Supabase é o menor lugar para guardá-la. Dois passos em volta pesam mais.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":738,"title":739,"description":740,"published":741,"category":482,"image":742,"draft":486},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Seu arquivo .env está exposto? Os doze caminhos para testar","Seu arquivo .env está exposto no seu próprio servidor web? Doze endereços dizem isso em um minuto, e um acerto significa que tudo nele já é público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":744,"title":745,"description":746,"published":747,"category":482,"image":748,"draft":486},"\u002Fblog\u002Fis-v0-safe","Segurança do v0: os 1.790 aplicativos v0 escaneados tiraram A","A segurança do v0 medida em 1.790 aplicativos v0 no ar: todos tiraram A. Só 17 citavam um banco de dados, e é sobretudo isso que esse A mede.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":750,"title":751,"description":752,"published":753,"category":482,"image":754,"draft":486},"\u002Fblog\u002Fis-bolt-safe","O Bolt é seguro? O que vimos em 1.123 aplicativos Bolt","O Bolt é seguro? Passamos 1.123 aplicativos Bolt no ar por nove verificações. A hospedagem saiu limpa. Os achados: chaves e tabelas abertas nos aplicativos.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":465,"title":756,"description":757,"published":758,"category":482,"image":759,"draft":486},"O Supabase caiu ou o problema é o seu app? Como saber","O Supabase caiu ou o problema é o seu app? Um projeto pausado, um banco cheio e um erro seu parecem iguais. Quatro verificações separam os casos.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":761,"title":762,"description":763,"published":764,"category":482,"image":765,"draft":486},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","O Supabase criptografa meus dados? Sim. Veja o que isso impede","O Supabase criptografa os dados? Sim: AES-256 em repouso, TLS em trânsito, SOC 2 e ISO 27001. O que cada um cobre, e o vazamento que nenhum deles impede.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":767,"title":768,"description":769,"published":770,"category":482,"image":771,"draft":486},"\u002Fblog\u002Fsupabase-free-plan-limits","O Supabase é gratuito? Sim, com estes limites e sem backups","Sim: o plano gratuito do Supabase vai até 500 MB de banco e 5 GB de egress, sem nenhum backup. O que para em cada limite e o que muda no Pro de $25.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":773,"title":774,"description":775,"published":776,"category":590,"image":777,"draft":486},"\u002Fblog\u002Ftest-your-supabase-backup","Teste o backup do seu Supabase antes do dia em que precisar","Como testar o backup do seu Supabase: restaurar num projeto de teste, contar as linhas, entrar e procurar a linha que falta num arquivo cortado.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":779,"title":780,"description":781,"published":782,"category":590,"image":783,"draft":486},"\u002Fblog\u002Fsupabase-backup-github-action","Backup grátis do Supabase com uma GitHub Action, e a pegadinha","Um backup do Supabase com GitHub Action é grátis e serve para muitos apps. O workflow, a connection string certa e o egress de cada execução.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":785,"title":786,"description":787,"published":788,"category":590,"image":789,"draft":486},"\u002Fblog\u002Fdownload-your-supabase-backup","Por que você não consegue baixar seu backup do Supabase","Você não consegue baixar seu backup do Supabase num projeto atual, porque a cópia diária é um snapshot físico. Como conferir e como ter uma cópia só sua.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":791,"title":792,"description":793,"published":788,"category":482,"image":794,"draft":486},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": o grant que falta","A partir de 30 de outubro, uma tabela nova no Supabase responde \"permission denied for table\" até receber um grant. O e-mail mostra só metade.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":796,"title":797,"description":798,"published":799,"category":482,"image":800,"draft":486},"\u002Fblog\u002Fopen-api-endpoint-exposed","Um endpoint de API aberto é um problema? Leia o JSON","Seu scan apontou um endpoint de API aberto. Se isso importa depende do que voltou, e a maioria dos que encontramos era da própria plataforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":802,"title":803,"description":804,"published":805,"category":482,"image":806,"draft":486},"\u002Fblog\u002Flovable-security-scan","Escaneamento de segurança do Lovable: o que ele não prova","Escaneamento de segurança do Lovable: o que o Quick scan e o Deep scan checam, quando cada um roda, e a única coisa que nenhum escaneamento por dentro prova.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":808,"title":809,"description":810,"published":811,"category":590,"image":812,"draft":486},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":22,"title":814,"description":815,"published":816,"category":482,"image":817,"draft":486},"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":819,"title":820,"description":821,"published":822,"category":482,"image":823,"draft":486},"\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":825,"title":826,"description":827,"published":828,"category":482,"image":829,"draft":486},"\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":831,"title":832,"description":833,"published":834,"category":482,"image":835,"draft":486},"\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":837,"title":838,"description":839,"published":840,"category":482,"image":841,"draft":486},"\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":843,"title":844,"description":845,"published":846,"category":482,"image":847,"draft":486},"\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":849,"title":850,"description":851,"published":852,"category":482,"image":853,"draft":486},"\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":855,"title":856,"description":857,"published":858,"category":482,"image":859,"draft":486},"\u002Fblog\u002Fis-replit-safe","O Replit é seguro? O que vimos em 3.042 aplicativos Replit no ar","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.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":861,"title":862,"description":863,"published":864,"category":590,"image":865,"draft":486},"\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":867,"title":868,"description":869,"published":870,"category":590,"image":871,"draft":486},"\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":873,"title":874,"description":875,"published":876,"category":590,"image":877,"draft":486},"\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":879,"title":880,"description":881,"published":882,"category":482,"image":883,"draft":486},"\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":885,"title":886,"description":887,"published":888,"category":482,"image":889,"draft":486},"\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":891,"title":892,"description":893,"published":894,"category":482,"image":895,"draft":486},"\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":897,"title":898,"description":899,"published":900,"category":482,"image":901,"draft":486},"\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":903,"title":904,"description":905,"published":906,"category":482,"image":907,"draft":486},"\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. Oito ferramentas comparadas, com preços.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":909,"title":910,"description":911,"published":912,"category":482,"image":913,"draft":486},"\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":915,"title":916,"description":917,"published":918,"category":482,"image":919,"draft":486},"\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":921,"title":922,"description":923,"published":924,"category":482,"image":925,"draft":486},"\u002Fblog\u002Fmissing-security-headers","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":927,"title":928,"description":929,"published":930,"category":482,"image":931,"draft":486},"\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":933,"title":934,"description":935,"published":936,"category":482,"image":937,"draft":486},"\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":939,"title":940,"description":941,"published":942,"category":590,"image":943,"draft":486},"\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":945,"title":946,"description":947,"published":948,"category":482,"image":949,"draft":486},"\u002Fblog\u002Freplit-secrets-explained","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":951,"title":952,"description":953,"published":954,"category":590,"image":955,"draft":486},"\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":957,"title":958,"description":959,"published":960,"category":482,"image":961,"draft":486},"\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":963,"title":964,"description":965,"published":966,"category":482,"image":967,"draft":486},"\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":969,"title":970,"description":971,"published":972,"category":482,"image":973,"draft":486},"\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":975,"title":976,"description":977,"published":978,"category":482,"image":979,"draft":486},"\u002Fblog\u002Fcors-wildcard-security-risk","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":981,"title":982,"description":983,"published":984,"category":590,"image":985,"draft":486},"\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":987,"title":988,"description":989,"published":990,"category":590,"image":991,"draft":486},"\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":993,"title":994,"description":995,"published":996,"category":482,"image":997,"draft":486},"\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":999,"title":1000,"description":1001,"published":1002,"category":482,"image":1003,"draft":486},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","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":1005,"title":1006,"description":1007,"published":1008,"category":590,"image":1009,"draft":486},"\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":1011,"title":1012,"description":1013,"published":1014,"category":482,"image":1015,"draft":486},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","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":1017,"title":1018,"description":1019,"published":1014,"category":482,"image":1020,"draft":486},"\u002Fblog\u002Fsource-maps-exposed-in-production","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":1022,"title":1023,"description":1024,"published":1025,"category":482,"image":1026,"draft":486},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: é a mesma coisa que a anon key?","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":1028,"title":1029,"description":1030,"published":1031,"category":590,"image":1032,"draft":486},"\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":1034,"title":1035,"description":1036,"published":1037,"category":482,"image":1038,"draft":486},"\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":1040,"title":1041,"description":1042,"published":1037,"category":590,"image":1043,"draft":486},"\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":1045,"title":1046,"description":1047,"published":1048,"category":590,"image":1049,"draft":486},"\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":1051,"title":1052,"description":1053,"published":1048,"category":482,"image":1054,"draft":486},"\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",1794213649065]