[{"data":1,"prerenderedAt":380},["ShallowReactive",2],{"blog-pt-cors-wildcard-security-risk":3},{"id":4,"title":5,"body":6,"category":339,"cover":340,"coverAlt":341,"description":342,"draft":343,"extension":344,"faq":345,"image":361,"keywords":362,"meta":369,"navigation":370,"ogTitle":30,"path":371,"published":372,"seo":373,"stem":374,"tldr":375,"updated":372,"__hash__":379},"blog_pt\u002Fblog\u002Fcors-wildcard-security-risk.md","Um curinga CORS é um risco de segurança? Quase nunca.",{"type":7,"value":8,"toc":327},"minimark",[9,18,26,31,34,44,47,50,54,57,63,66,72,75,79,82,85,168,175,178,182,193,196,202,207,210,214,217,220,229,232,236,239,257,263,271,278,282,307,314],[10,11,12,13,17],"p",{},"Seu scan voltou com uma linha que se lê como um alarme: sua API está aberta para\nqualquer site. Ou alguém da área técnica olhou o que o seu servidor devolve e\ndisse que o seu aplicativo tem um curinga CORS, que é o caractere ",[14,15,16],"code",{},"*",", que\naparentemente significa todo mundo.",[10,19,20,21,25],{},"Aqui está a parte que guia após guia conta errado: ",[22,23,24],"strong",{},"o curinga quase nunca é o\nque abriu a sua API."," Ele é uma instrução que o seu servidor anexa às\nrespostas, endereçada aos navegadores de pessoas que estão em outros sites, e\nchega depois que a resposta já saiu. Restringi-lo impede que a página de outro\nsite leia os seus dados. Não faz nada contra quem os lê sem navegador nenhum.",[27,28,30],"h2",{"id":29},"um-curinga-cors-é-um-risco-de-segurança","Um curinga CORS é um risco de segurança?",[10,32,33],{},"Sozinho, quase nunca. Vira um no momento em que algo privado responde atrás\ndele.",[10,35,36,37,39,40,43],{},"O curinga é o valor ",[14,38,16],{}," num cabeçalho de resposta chamado\n",[14,41,42],{},"Access-Control-Allow-Origin",", e significa que o código de qualquer site pode\nler aquela resposta específica. Isso soa como uma afirmação sobre quem consegue\nchegar nos seus dados. É uma afirmação sobre quem pode ler o que o seu servidor\njá mandou.",[10,45,46],{},"O endereço que um scan verifica é aquele de onde o seu aplicativo é servido. Na\nmaioria dos builders, esse endereço distribui suas páginas, suas imagens e seu\ncódigo compilado, e tudo isso vai para cada visitante por design. Um curinga em\ncima disso concede permissão para ler arquivos que qualquer um já podia baixar\nabrindo o seu site.",[10,48,49],{},"Então o achado é uma pergunta e não um veredicto, e a pergunta é o que está\natrás do cabeçalho. Se a resposta é sua página inicial, não aconteceu nada. Se a\nresposta é uma lista dos seus clientes, essa lista já estava ao alcance de\nqualquer um que tivesse o endereço.",[27,51,53],{"id":52},"o-que-o-access-control-allow-origin-realmente-faz","O que o Access-Control-Allow-Origin realmente faz",[10,55,56],{},"Ele diz ao navegador do seu visitante se a página que está na tela pode olhar\numa resposta que o seu servidor já mandou.",[10,58,59,60,62],{},"A ordem é a coisa toda, e ela corre ao contrário de como quase todo mundo\nimagina. Uma página em algum outro site executa um pedaço de código que pede\ndados ao seu aplicativo. A requisição sai. Seu servidor a recebe, executa o que\ntiver que executar e devolve a resposta inteira. Só então o navegador lê o\ncabeçalho daquela resposta e decide se entrega o conteúdo à página que pediu. O\npróprio guia de CORS da MDN resume em uma linha: o servidor precisa consentir\ncom ",[14,61,42],{}," para compartilhar a resposta com o script.",[10,64,65],{},"Seus dados saíram do prédio de um jeito ou de outro. O que o cabeçalho decide é\nse um pedaço específico de código, rodando dentro do navegador de uma pessoa\nespecífica, chega a vê-los.",[67,68],"diagram",{"alt":69,"caption":70,"src":71},"Um servidor responde a dois chamadores com uma resposta idêntica. Na faixa de cima a resposta chega a um navegador, que a segura numa barreira, de modo que a página atrás dele não recebe nada. Na faixa de baixo não há barreira alguma e a mesma resposta chega intacta a uma janela de terminal.","Os dois chamadores recebem uma resposta, porque o servidor a manda antes de qualquer coisa ser verificada. A barreira na faixa de cima é o navegador, e na faixa de baixo não existe navegador nenhum.","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fwho-reads-the-header-1600x650.png",[10,73,74],{},"O navegador é a única coisa nessa história que lê o cabeçalho. Um script num\nservidor, uma ferramenta de linha de comando, um raspador, um aplicativo de\ncelular: nenhum deles o consulta, porque ele foi escrito para um navegador e não\nhá navegador envolvido. Eles mandam a mesma requisição, recebem a mesma resposta\ne leem cada byte dela.",[27,76,78],{"id":77},"restringir-o-cors-não-deixa-privado-um-endpoint-aberto","Restringir o CORS não deixa privado um endpoint aberto",[10,80,81],{},"Porque o CORS vive dentro dos navegadores, e quem está se servindo dos seus\ndados não tem motivo para usar um.",[10,83,84],{},"Essa é a parte que custa uma tarde. A pessoa vê o achado do curinga, estreita o\ncabeçalho para o próprio domínio, faz o deploy de novo, escaneia de novo, e o\nendereço que distribuía linhas de clientes continua distribuindo linhas de\nclientes. Sempre distribuiu. O único chamador que chegou a parar foi a página\nweb de outra pessoa.",[86,87,88,109],"table",{},[89,90,91],"thead",{},[92,93,94,98,103,106],"tr",{},[95,96,97],"th",{},"O que alguém tenta",[95,99,100,101],{},"Curinga ",[14,102,16],{},[95,104,105],{},"Só o seu domínio",[95,107,108],{},"Qualquer origem devolvida como eco, credenciais liberadas",[110,111,112,125,136,148],"tbody",{},[92,113,114,118,121,123],{},[115,116,117],"td",{},"Abrir o endereço numa aba do navegador",[115,119,120],{},"Funciona",[115,122,120],{},[115,124,120],{},[92,126,127,130,132,134],{},[115,128,129],{},"Ler o endereço por um script ou um terminal",[115,131,120],{},[115,133,120],{},[115,135,120],{},[92,137,138,141,143,146],{},[115,139,140],{},"A página de outro site lendo o endereço",[115,142,120],{},[115,144,145],{},"Bloqueado",[115,147,120],{},[92,149,150,153,159,163],{},[115,151,152],{},"Outro site lendo o endereço como o seu usuário logado",[115,154,155],{},[156,157,145],"key-verdict",{"type":158},"safe",[115,160,161],{},[156,162,145],{"type":158},[115,164,165],{},[156,166,120],{"type":167},"danger",[10,169,170,171,174],{},"Leia a última linha duas vezes, porque é onde o conselho genérico desaba. Um\ncuringa puro não pode ser usado para ler dados que pertencem ao seu visitante\nlogado. Os navegadores recusam essa combinação de saída, e o guia de CORS da MDN\ndiz isso diretamente: se uma requisição leva um cookie e a resposta volta com\n",[14,172,173],{},"Access-Control-Allow-Origin: *",", o navegador bloqueia o acesso à resposta e\nregistra um erro de CORS no console. Ou seja, é justamente o curinga que torna\nesse ataque específico impossível.",[10,176,177],{},"A coluna que de fato entrega os dados de um usuário logado é a terceira, e para\nisso o servidor precisa escrever o endereço do próprio chamador dentro da sua\nresposta.",[27,179,181],{"id":180},"a-configuração-de-cors-que-é-de-fato-perigosa","A configuração de CORS que é de fato perigosa",[10,183,184,185,188,189,192],{},"Um servidor que lê o cabeçalho ",[14,186,187],{},"Origin"," da requisição, escreve esse mesmo valor\ndentro da própria resposta e manda\n",[14,190,191],{},"Access-Control-Allow-Credentials: true"," junto.",[10,194,195],{},"Ninguém se propõe a fazer isso. Acontece no fim de uma tarde tentando fazer um\ncuringa funcionar com requisições autenticadas e descobrindo que ele nunca vai\nfuncionar. Devolver como eco a origem que perguntou parece a saída: todo site\nque deveria ser permitido é permitido, os erros no console param, a\nfuncionalidade vai ao ar. O que o servidor está dizendo, na verdade, é que quem\ndecide é o chamador, e isso inclui uma página que ninguém escreveu ainda.",[10,197,198,199,201],{},"Veja o que isso permite. Sua cliente está logada no seu aplicativo, com um\ncookie de sessão no navegador dela. Em outra aba ela abre um site que não tem\nnada a ver com você. O código desse site pede à sua API a conta dela. O\nnavegador dela anexa o cookie, porque anexar cookies é o que navegadores fazem.\nSeu servidor lê uma ",[14,200,187],{}," da qual nunca ouviu falar, carimba essa origem na\nresposta como permissão e acrescenta que credenciais estão liberadas. O\nnavegador confere, encontra correspondência e entrega os dados da sua cliente a\numa página que ela não sabia que estava lendo.",[67,203],{"alt":204,"caption":205,"src":206},"Uma requisição sai de um site desconhecido levando uma etiqueta vermelha com um nome e um cookie. O servidor copia essa mesma etiqueta vermelha para o campo de permissão da resposta. O navegador compara as duas etiquetas, acha que são iguais e deixa os dados passarem até a página.","O chamador fornece o nome, e o servidor escreve esse nome no crachá. Quem pergunta está na lista, e é isso que diferencia esse caso de um curinga.","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fthe-echoed-origin-1600x680.png",[10,208,209],{},"Na nossa varredura de agosto de 2026 isso apareceu em 61 dos 30.926 aplicativos\nem que a verificação conseguiu uma resposta. Dos três achados de CORS, é o único\nque alcança dados que estão atrás de um login.",[27,211,213],{"id":212},"com-que-frequência-um-curinga-aparece-e-quem-decide-isso","Com que frequência um curinga aparece, e quem decide isso",[10,215,216],{},"Na maior parte das vezes, quem decide é o seu builder. Nessa mesma varredura,\n5.727 daqueles 30.926 aplicativos mandavam um curinga, e o melhor indicador\nisolado de que o seu manda é a plataforma que o publicou.",[10,218,219],{},"A verificação de CORS registrou pelo menos um achado em 5.418 dos 5.419\naplicativos do Base44 em que obteve resposta, e em 8 dos 18.518 do Lovable. O\nReplit ficou no meio, com 1.129 de 3.037. Uma diferença tão grande é a cara de\num padrão de hospedagem visto de fora: quase total numa plataforma, quase\nausente em outra, ao longo de milhares de aplicativos cujos donos nunca\ncombinaram nada entre si.",[10,221,222,223,228],{},"Três achados distintos compõem a verificação de CORS nos 30.926 aplicativos: um\ncuringa em 5.727 deles, um endereço respondendo com dados e sem login em 3.852,\ne o formato da origem devolvida como eco em 61. A soma passa da própria\nverificação, porque muitos aplicativos têm dois dos três. Todo número aqui vem\nda\n",[224,225,227],"a",{"href":226},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nossa varredura de 30.998 aplicativos vibe-coded no ar",",\nque publica cada um junto com a base sobre a qual foi medido.",[10,230,231],{},"O que você pode mudar em tudo isso se divide do mesmo jeito. O curinga é enviado\npor quem serve o seu aplicativo, e num aplicativo vibe-coded normalmente é o\nbuilder. O que volta quando um estranho pede dados a um dos seus endereços foi\ndecidido dentro do seu aplicativo, por você ou pelo builder que escreve código\nem seu nome.",[27,233,235],{"id":234},"como-verificar-o-seu-próprio-aplicativo","Como verificar o seu próprio aplicativo",[10,237,238],{},"Duas coisas para olhar, e a segunda é a que decide se algo disso importa.",[10,240,241,244,245,248,249,252,253,256],{},[22,242,243],{},"Seu aplicativo manda um curinga?"," Abra seu aplicativo no ar, aperte F12 para\nabrir as ferramentas de desenvolvedor do navegador, clique em ",[22,246,247],{},"Network"," e\nrecarregue a página. Clique na primeira requisição da lista e leia o painel\n",[22,250,251],{},"Response Headers",". Uma linha com ",[14,254,255],{},"access-control-allow-origin: *"," é o achado.\nNenhuma linha desse tipo significa que o seu servidor não compartilha nada entre\norigens com ninguém.",[10,258,259,262],{},[22,260,261],{},"O que responde atrás?"," Continue na aba Network e recarregue o aplicativo\nlogado, de olho nas requisições que voltam em JSON. Esses são os endereços de\nonde seu aplicativo busca dados. Copie cada URL, abra uma janela anônima para\nficar deslogado e cole uma de cada vez. Tudo que voltar com linhas de verdade,\nem vez de um erro ou de uma lista vazia, pode ser lido por qualquer pessoa na\ninternet que tenha aquela URL. Isso vale hoje, diga o seu cabeçalho CORS o que\ndisser, e continua valendo depois que você estreitá-lo.",[10,264,265,266,270],{},"Nosso scan gratuito faz a segunda verificação por você: lê o código do seu\naplicativo atrás dos endereços que ele chama, consulta cada um sem login e\nreporta os que responderam com dados. Leva cerca de 20 segundos e não precisa de\nconta: ",[224,267,269],{"href":268},"\u002F#scan","escaneie seu aplicativo",".",[10,272,273,274,270],{},"Se o seu aplicativo fala com o Supabase direto do navegador, há um terceiro\nlugar para olhar, porque as regras de cada tabela decidem quem pode ler quais\nlinhas e\n",[224,275,277],{"href":276},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","ligá-las não é o mesmo que estar protegido",[27,279,281],{"id":280},"o-que-fazer-agora","O que fazer agora",[283,284,285],"key-takeaways",{},[286,287,288,292,295,298,304],"ul",{},[289,290,291],"li",{},"Trate um achado de curinga como uma pergunta sobre o que está atrás do cabeçalho. No endereço de onde seu aplicativo é servido, ele normalmente permite ler arquivos que cada visitante baixa de qualquer jeito.",[289,293,294],{},"Saia da sua conta e abra cada endereço de dados que o seu aplicativo chama. Tudo que devolver linhas de verdade para um navegador deslogado é público para todo mundo, diga o cabeçalho o que disser.",[289,296,297],{},"Corrija um endereço aberto no próprio endereço: exija login e responda a um estranho com um 401. Estreitar o cabeçalho CORS deixa esse endereço alcançável por tudo, menos pelas páginas web dos outros.",[289,299,300,301,303],{},"Se o seu servidor devolve como eco a origem que perguntou e manda ",[14,302,191],{},", troque isso hoje por uma lista dos seus próprios domínios. É o único caso aqui que deixa outro site ler dados como o seu usuário logado.",[289,305,306],{},"Se o cabeçalho vem da hospedagem do seu builder e você não consegue mudá-lo, gaste o tempo nos endpoints. É lá que estão os seus dados.",[10,308,309,310,270],{},"O hábito que vale manter é a passada deslogada pelos seus próprios endereços de\ndados, porque cada funcionalidade nova acrescenta mais um e nada muda na tela\nquando um deles começa a responder. O Reeve Care roda esse mesmo scan contra seu\naplicativo no ar em uma programação e te avisa por e-mail quando um resultado\npiora: ",[224,311,313],{"href":312},"\u002F#pricing","o que ele vigia e quanto custa",[10,315,316,317,321,322,326],{},"Se você prefere resolver tudo de uma vez, a\n",[224,318,320],{"href":319},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre isso ao lado do resto\ndo que um aplicativo recém-lançado costuma deixar aberto, e\n",[224,323,325],{"href":324},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","quais chaves são seguras no seu frontend","\né a outra metade da pergunta com que as pessoas costumam chegar.",{"title":328,"searchDepth":329,"depth":329,"links":330},"",3,[331,333,334,335,336,337,338],{"id":29,"depth":332,"text":30},2,{"id":52,"depth":332,"text":53},{"id":77,"depth":332,"text":78},{"id":180,"depth":332,"text":181},{"id":212,"depth":332,"text":213},{"id":234,"depth":332,"text":235},{"id":280,"depth":332,"text":281},"Noções de segurança","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcover-1200x630.png","Seis chamadores diferentes alcançam um mesmo servidor, e a mesma resposta volta para cada um deles.","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.",false,"md",[346,349,352,355,358],{"q":347,"a":348},"Meu scan diz que minha API está aberta para qualquer site. Preciso corrigir?","Olhe primeiro o que responde atrás. Um curinga no endereço de onde seu aplicativo é servido costuma permitir a leitura das suas páginas, das suas imagens e do seu código compilado, e tudo isso cada visitante baixa de qualquer jeito. Corrija quando um endereço atrás desse cabeçalho devolver dados de verdade para alguém que não está logado, e corrija nesse endereço, exigindo login.",{"q":350,"a":351},"Restringir o CORS ao meu próprio domínio deixa minha API privada?","Não. CORS é uma regra que os navegadores aplicam a si mesmos, então ela só governa código rodando na página web de outra pessoa. Um script, um comando de terminal ou um raspador mandam a mesma requisição e leem a mesma resposta, porque nenhum deles consulta o cabeçalho. Se um endereço devolve seus dados sem login, ele faz isso para todo mundo, diga o cabeçalho o que disser.",{"q":353,"a":354},"Outro site pode ler os dados dos meus usuários logados por causa de um curinga?","Com um curinga puro, não. Os navegadores recusam essa combinação: o guia de CORS da MDN afirma que, quando uma requisição leva um cookie e a resposta volta com Access-Control-Allow-Origin no curinga, o navegador bloqueia o acesso à resposta e registra um erro de CORS. A versão que de fato funciona é um servidor que devolve como eco a origem que perguntou, junto com Access-Control-Allow-Credentials em true.",{"q":356,"a":357},"Como eu mudo o cabeçalho CORS num aplicativo Lovable ou Base44?","Muitas vezes você não muda, porque o cabeçalho é enviado pela hospedagem em que seu builder publica e vale para todos os aplicativos daquela plataforma. Vale saber disso antes de gastar uma semana no assunto. O que você sempre pode mudar é o que os seus endpoints devolvem para uma requisição sem login, e é aí que a correção pertence de qualquer forma.",{"q":359,"a":360},"Meu scan também apontou endpoints de API abertos. É o mesmo achado?","É outro, e o mais grave dos dois. Um curinga descreve quem pode ler uma resposta. Um endpoint aberto significa que a resposta continha seus dados e chegou sem que ninguém fizesse login. O segundo vale igualmente para um navegador, para um script e para um estranho com a URL, e estreitar seu cabeçalho CORS não muda nada disso.","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",[363,364,365,366,367,368],"curinga cors risco de segurança","access-control-allow-origin curinga","curinga cors é perigoso","configuração errada de cors","api aberta para qualquer site","access-control-allow-credentials true",{},true,"\u002Fblog\u002Fcors-wildcard-security-risk","2026-08-26",{"title":5,"description":342},"blog\u002Fcors-wildcard-security-risk",[376,377,378],"Um curinga CORS só é um risco de segurança quando algo privado responde atrás dele. Sozinho, ele permite ler coisas que qualquer pessoa já podia baixar.","O cabeçalho é uma instrução para o navegador do seu visitante e chega depois que a resposta já saiu. Ninguém o lê fora de um navegador, então restringi-lo deixa um endpoint aberto exatamente igual.","O formato que merece uma noite é um servidor que devolve como eco o site que está perguntando e ainda permite credenciais. Esse deixa outro site ler dados como o seu usuário logado.","ZdhE5imXOZwIR-LExar8qL3R1tSYC03r3sPKXzyh2Yw",1787826050866]