[{"data":1,"prerenderedAt":305},["ShallowReactive",2],{"blog-pt-source-maps-exposed-in-production":3},{"id":4,"title":5,"body":6,"category":262,"cover":263,"coverAlt":263,"description":264,"draft":265,"extension":266,"faq":267,"image":283,"keywords":284,"meta":292,"navigation":293,"ogTitle":294,"path":295,"published":296,"seo":297,"stem":298,"tldr":299,"updated":296,"__hash__":304},"blog_pt\u002Fblog\u002Fsource-maps-exposed-in-production.md","Source maps expostos: seu app está publicando o código original",{"type":7,"value":8,"toc":251},"minimark",[9,13,16,21,24,27,30,44,48,51,54,65,71,74,78,81,107,110,118,122,125,128,136,139,143,146,149,154,161,165,168,171,181,196,203,207,235,243],[10,11,12],"p",{},"Você escaneou seu app, e uma linha do relatório diz que seu código-fonte\noriginal está publicado. Ou alguém técnico apertou F12 no seu site e disse que\nseus source maps estão expostos. De um jeito ou de outro, soa mal de uma forma\nespecífica e pessoal: a coisa que você passou meses construindo está, pelo\nvisto, largada à vista de todos, comentários incluídos.",[10,14,15],{},"A leitura alarmada e o dar de ombros erram as duas. Um source map não é um\nsegredo. É um mapa (o nome é literal) para onde os seus segredos estariam, se\nalgum dia algum acabou escrito no seu código. Se o seu importa depende do que\nhá lá dentro, e conferir leva uns 30 segundos.",[17,18,20],"h2",{"id":19},"é-ruim-que-seus-source-maps-estejam-expostos","É ruim que seus source maps estejam expostos?",[10,22,23],{},"É algo para consertar nesta semana. Raramente é motivo de pânico hoje à noite.",[10,25,26],{},"O que um source map exposto revela é código, e seu app já entrega o próprio\ncódigo a cada visitante, comprimido num bloco ilegível, mas presente, porque a\nweb funciona assim. Um estranho paciente, com as ferramentas certas, conseguiria\nreconstruir uma versão aproximada só a partir do arquivo comprimido. O mapa\nelimina a exigência de paciência: com ele, qualquer pessoa que aperte F12 lê o\nseu projeto arrumado do jeito que aparece no seu editor.",[10,28,29],{},"Nosso scanner classifica um source map publicado como médio, o meio da escala\nde severidade, e essa posição é proposital. Sozinho, código legível é uma perda\nde privacidade: alguém pode estudar como seu app funciona, ler suas funções\npela metade, pegar emprestadas as suas ideias. Desagradável, e para um app\ncujo valor é um prompt engenhoso ou um fluxo incomum, um problema de negócio\nreal. Não um caixa aberto.",[10,31,32,33,38,39,43],{},"O peso muda no dia em que seu código contém algo que nunca deveria ter sido\ncódigo. Uma chave que roda como parte do seu app acaba também no arquivo\ncomprimido. O mapa a torna mais fácil de achar, mas ela já estava publicada, e\nisso é\n",[34,35,37],"a",{"href":36},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","um achado próprio, maior",".\nComentários são diferentes. A compressão os apaga do que é entregue, então o\nmapa é o único lugar público onde um comentário existe. Uma senha numa linha\ncomentada, uma nota ",[40,41,42],"code",{},"remove before launch"," em cima da coisa que nunca foi\nremovida, um endereço interno anotado ao lado da função que o chama: nada\ndisso está ao alcance de um estranho a não ser no mapa.",[17,45,47],{"id":46},"o-que-é-um-source-map-afinal","O que é um source map, afinal",[10,49,50],{},"É a tradução entre o código que seu site entrega e o código que você escreveu.",[10,52,53],{},"Quando seu app é publicado, a etapa de build comprime o código: todos os\narquivos espremidos juntos, cada nome encurtado para uma ou duas letras, cada\ncomentário removido, tudo numa única linha enorme. Navegadores executam isso\nsem reclamar. Ninguém consegue ler, nem as ferramentas que o construíram, e\nisso vira problema no momento em que algo quebra e o erro aponta para a linha\n1, caractere 48.120, de um arquivo que nenhum humano jamais viu.",[10,55,56,57,60,61,64],{},"Então as ferramentas de build escrevem um segundo arquivo, o source map. Ele\nfica ao lado do comprimido (",[40,58,59],{},"app.js"," ganha ",[40,62,63],{},"app.js.map",") e guarda tudo que a\ncompressão jogou fora: seus arquivos originais, seus nomes, a estrutura de\npastas e cada comentário. A última linha do arquivo comprimido carrega o\nendereço do mapa, e um navegador o baixa quando as ferramentas de\ndesenvolvedor abrem. Esse é todo o desenho. Ele existe para que um erro possa\napontar para o código que você escreveu de verdade.",[66,67],"diagram",{"alt":68,"caption":69,"src":70},"À esquerda, um arquivo de bundle comprimido desenhado como um muro de traços ilegíveis, com seu arquivo de source map embaixo. Uma seta leva à direita, ao mesmo app virado um projeto legível: uma pasta src, arquivos de componentes e linhas de código em que duas linhas de comentário estão destacadas em âmbar.","O arquivo comprimido é o que seus visitantes executam. O mapa o transforma de volta no projeto que você escreveu. Os comentários, tirados do bundle, existem só do lado legível.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fwhat-the-map-reveals-1600x720.png",[10,72,73],{},"Duas coisas seguem desse desenho. Seus visitantes nunca baixam o mapa (um\nnavegador só o pede quando as ferramentas de desenvolvedor abrem), então um\nmapa publicado não custa nada, não muda nada na tela e nunca se anuncia. E\nqualquer coisa que consiga abrir seu site consegue baixar o mapa, porque o\nendereço está escrito na página e não há login na frente. Se o arquivo está lá\né um ajuste de build, e de fora, ligado parece exatamente igual a desligado até\nalguém ir olhar.",[17,75,77],{"id":76},"como-verificar-seu-app-em-30-segundos","Como verificar seu app em 30 segundos",[10,79,80],{},"No seu app no ar, o endereço publicado que seus usuários visitam, não a prévia\ndentro do builder:",[82,83,84,88,96],"ol",{},[85,86,87],"li",{},"Abra o app no Chrome, Edge ou Firefox e aperte F12. Isso abre as ferramentas\nde desenvolvedor do navegador, o mesmo painel que um estranho usaria.",[85,89,90,91,95],{},"Clique na aba ",[92,93,94],"strong",{},"Sources",", no topo do painel.",[85,97,98,99,102,103,106],{},"Leia a árvore de arquivos à esquerda. Código comprimido aparece como um ou\ndois arquivos com nomes tipo ",[40,100,101],{},"index-4f81ab2c.js",". Source maps aparecem como\no seu projeto: uma pasta chamada ",[40,104,105],{},"src",", arquivos com os nomes das suas\npáginas e componentes, e dentro deles código que dá para ler de verdade.",[10,108,109],{},"Se você consegue abrir um arquivo ali e ver seus próprios comentários, seus\nsource maps estão publicados. O navegador só desenha aquela árvore porque\nbaixou o mapa do seu site no ar, exatamente como faria o navegador de qualquer\noutra pessoa.",[10,111,112,113,117],{},"Se preferir não fuçar em painéis, nosso scan gratuito lê seu site no ar de fora\ne relata esta verificação junto com outras oito: ",[34,114,116],{"href":115},"\u002F#scan","escanear seu app",".\nLeva uns 20 segundos e não pede conta.",[17,119,121],{"id":120},"o-que-um-estranho-consegue-ver-e-o-que-não","O que um estranho consegue ver, e o que não",[10,123,124],{},"Tudo que você escreveu dentro do próprio app, e nada além dele.",[10,126,127],{},"Source maps publicados revelam o seu frontend: suas páginas, seus componentes,\na lógica que roda no navegador, os nomes das rotas que seu app chama, qualquer\nprompt que você tenha escrito dentro do app e cada comentário.",[10,129,130,131,135],{},"Eles não alcançam seu servidor. Código rodando numa edge function ou num\nbackend fica onde está. Também não abrem seu banco de dados. Se um estranho\npode ler suas tabelas é decidido pelas regras de cada tabela, não pela\nvisibilidade do seu código, e\n",[34,132,134],{"href":133},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","essa pergunta nós medimos em separado","\nnos mesmos apps.",[10,137,138],{},"Na prática, o dano de um mapa publicado chega como leitura silenciosa, não como\numa invasão dramática: alguém estuda sua lógica de checkout procurando um jeito\nde contorná-la, ou encontra uma rota de administração que ninguém nunca linkou\ne a testa. Cada uma dessas coisas só vira problema se o que foi encontrado\nestava desprotegido. O mapa é um guia para o estranho; ele não é, em si, a\nporta aberta.",[17,140,142],{"id":141},"com-que-frequência-source-maps-publicados-aparecem","Com que frequência source maps publicados aparecem",[10,144,145],{},"Em agosto de 2026 escaneamos 30.998 apps no ar publicados a partir de Lovable,\nBase44, Replit, v0 e Bolt. Um em cada oito (13%) servia pelo menos um source\nmap em funcionamento.",[10,147,148],{},"Só contamos um mapa quando ele responde de verdade. O endereço no fim de um\narquivo comprimido não prova nada sozinho, porque muitos builds escrevem o\nendereço e nunca sobem o arquivo; nosso scanner o segue e confere que um mapa\nreal volta. E onde a verificação não pôde ser concluída, registramos que não\npôde ser concluída. Um app que não conseguimos verificar é desconhecido, não\nlimpo.",[66,150],{"alt":151,"caption":152,"src":153},"Um arquivo de bundle comprimido terminando na linha sourceMappingURL=index-4f81.js.map, com dois desfechos possíveis desenhados embaixo. Num deles, o pedido do mapa retorna 200 com um arquivo JSON e carrega um X âmbar: o código está publicado. No outro, retorna 404, marcado com um tique verde.","O endereço sozinho não prova nada. O achado é um mapa que responde. Um 404 nesse endereço significa que o ajuste está desligado, diga o que disser a última linha do bundle.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fdoes-the-map-answer-1600x640.png",[10,155,156,157,160],{},"Dois outros números da mesma varredura colocam este no seu lugar. O vazamento\nsobre o qual donos de app mais recebem aviso (uma chave secreta na página, do\ntipo que ignora toda regra do banco de dados) apareceu 3 vezes nesses 30.998\napps. E uma tabela de banco de dados legível por qualquer estranho apareceu em\n",[34,158,159],{"href":133},"mais da metade dos apps em que conseguimos concluir essa verificação",".\nSource maps expostos ficam entre os dois: bem mais comuns que o vazamento\nfamoso, bem menos diretamente danosos que a tabela aberta. Que é exatamente o\nque uma severidade média está tentando dizer.",[17,162,164],{"id":163},"como-desligar-os-source-maps-em-produção","Como desligar os source maps em produção",[10,166,167],{},"Um ajuste de build, e depois um novo deploy.",[10,169,170],{},"Se um builder fez seu app, diga a ele em palavras simples, em inglês, onde os\nbuilders são mais confiáveis:",[172,173,178],"pre",{"className":174,"code":176,"language":177},[175],"language-text","Disable source map generation for production builds and redeploy.\n","text",[40,179,176],{"__ignoreMap":180},"",[10,182,183,184,187,188,191,192,195],{},"Se você mesmo gerencia o código, o ajuste mora na configuração de build. Num\nprojeto Vite (que é o que existe por baixo da maioria dos apps de Lovable e\nBolt) é ",[40,185,186],{},"build.sourcemap: false"," no ",[40,189,190],{},"vite.config","; um app Nuxt tem sua própria\nopção ",[40,193,194],{},"sourcemap",". Faça o deploy de novo e repita a verificação de 30 segundos:\na árvore de arquivos legível em Sources deve ter sumido, e só os nomes\ncomprimidos devem restar.",[10,197,198,199,202],{},"Dois arremates antes de dar isso por encerrado. Desligar os mapas não recolhe\nas cópias. Quem baixou seu mapa enquanto ele esteve no ar continua com seu\ncódigo do jeito que ele era naquele dia. Então leia seu próprio código antes de\nrelaxar: se em algum lugar há uma chave, uma senha ou qualquer outra coisa que\nnão deveria ser pública,\n",[34,200,201],{"href":36},"rotacione agora","; remover o\nmapa fecha a porta para leitores novos, não para o que já foi copiado. E o\najuste pode voltar: uma atualização de template, uma configuração regenerada\nou um novo destino de deploy pode religar os mapas sem você encostar em nada.",[17,204,206],{"id":205},"o-que-fazer-agora","O que fazer agora",[208,209,210],"key-takeaways",{},[211,212,213,219,226,229,232],"ul",{},[85,214,215,216,218],{},"Aperte F12 no seu app no ar, abra Sources e procure uma pasta chamada ",[40,217,105],{},". Arquivos legíveis com os seus próprios comentários significam que seus source maps estão publicados.",[85,220,221,222,225],{},"Desligue-os com uma instrução ao seu builder (disable source maps for production builds and redeploy) ou coloque você mesmo ",[40,223,224],{},"sourcemap: false"," na configuração de build.",[85,227,228],{},"Leia o que o mapa estava revelando antes de relaxar. Uma chave ou senha em qualquer ponto do seu código significa rotacioná-la hoje, porque remover o mapa não recolhe as cópias já feitas.",[85,230,231],{},"Deixe os source maps de desenvolvimento em paz. Eles estão fazendo o trabalho deles, e só o site publicado está em questão.",[85,233,234],{},"Repita a verificação de 30 segundos depois de atualizações de template e deploys grandes. Esse ajuste tem o costume de voltar sozinho.",[10,236,237,238,242],{},"Esse último hábito é o que escorrega, porque nada parece diferente quando a\nresposta muda. O Reeve Care roda este mesmo scan contra o seu app no ar num\ncalendário, esta verificação incluída, e escreve para você quando um resultado\npiora: ",[34,239,241],{"href":240},"\u002F#pricing","o que ele vigia e quanto custa",".",[10,244,245,246,250],{},"Se preferir fechar tudo de uma vez, o\n",[34,247,249],{"href":248},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre isto junto com as\noutras portas que valem uma olhada num app recém-lançado.",{"title":180,"searchDepth":252,"depth":252,"links":253},3,[254,256,257,258,259,260,261],{"id":19,"depth":255,"text":20},2,{"id":46,"depth":255,"text":47},{"id":76,"depth":255,"text":77},{"id":120,"depth":255,"text":121},{"id":141,"depth":255,"text":142},{"id":163,"depth":255,"text":164},{"id":205,"depth":255,"text":206},"Noções de segurança",null,"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.",false,"md",[268,271,274,277,280],{"q":269,"a":270},"Me disseram que meus source maps estão expostos. Isso é um vazamento de dados?","Não. Um source map contém o seu código, não os dados dos seus usuários. Seu banco de dados não está dentro dele, e nada do seu servidor também. Só vira algo sério quando o próprio código guarda um segredo: uma chave, uma senha, um endereço interno. Leia o que está escrito de fato no seu antes de decidir o tamanho da má notícia.",{"q":272,"a":273},"Podem roubar meu app se meus source maps forem públicos?","Podem ler seu código de frontend (páginas, componentes, a lógica do navegador e os comentários), e isso torna copiar as ideias do seu app mais fácil do que já era. Não conseguem seu código de servidor, seu banco de dados nem seus usuários. Para a maioria dos apps, o risco prático não é o roubo do código; é o segredo que acabou escrito no código pelo caminho.",{"q":275,"a":276},"Como removo os source maps do meu build de produção?","Diga ao seu builder em palavras simples: disable source map generation for production builds and redeploy. Se você mesmo gerencia o código, o ajuste fica na configuração de build: num projeto Vite é build.sourcemap no vite.config; coloque em false e faça o deploy de novo. Depois verifique com F12: a árvore de arquivos legível em Sources deve ter sumido.",{"q":278,"a":279},"Source maps em desenvolvimento também são um problema?","Não. Source maps existem para o desenvolvimento. São o que faz um erro apontar para o arquivo e a linha reais que você escreveu, em vez de algum ponto de uma única linha comprimida gigante. Sua prévia de desenvolvimento é um lugar que só você olha. A única pergunta que importa é se o seu site publicado os serve para o mundo.",{"q":281,"a":282},"Meu scan diz que meu código-fonte original não está publicado. Estou seguro?","Significa que nenhum source map em funcionamento respondeu quando olhamos, nada além disso. Seu código comprimido continua público, como o de todo app, e um deploy futuro pode mudar a resposta em silêncio, e é por isso que vale repetir a verificação depois de mudanças grandes.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",[285,286,287,288,289,290,291],"source maps expostos produção","source map exposto","remover source maps da produção","é ruim publicar source maps","source maps públicos","sourceMappingURL","vite sourcemap false",{},true,"Source maps expostos: seu app publica o próprio código?","\u002Fblog\u002Fsource-maps-exposed-in-production","2026-08-18",{"title":5,"description":264},"blog\u002Fsource-maps-exposed-in-production",[300,301,302,303],"Um source map exposto deixa qualquer um ler o código-fonte original do seu app (componentes, lógica e cada comentário) direto do navegador.","Sozinho, não é um vazamento. Código não é segredo. Mas um source map é um mapa para onde os seus segredos estariam, se algum dia algum acabou escrito no seu código.","Um em cada oito dos 30.998 apps vibe-coded que escaneamos em agosto de 2026 estava publicando seus source maps.","A verificação leva 30 segundos no navegador, e o conserto é um único ajuste de build.","0gnEQhwd9pXf2ArNjMIPGapkFQ5fA6JyB8OY9zngf8s",1787826050892]