AI-coded apps

    Lovable e Inteligência Artificial: Perigos da Migração sb_publishable na Supabase

    Migração das chaves da Supabase para o novo formato, com a sb_publishable no cliente e a sb_secret apenas no servidor.

    A migração das chaves da Supabase para o novo formato sb_publishable e sb_secret é benéfica, mas traz perigos em apps gerados com IA como o Lovable, sobretudo o risco de confundir as duas chaves. A sb_publishable substitui a chave anon e pode ser exposta no cliente, desde que a Row Level Security esteja ativa. A sb_secret substitui a service_role, ignora a RLS e nunca deve aparecer no cliente. O maior perigo durante a migração é colocar a sb_secret onde deveria estar a sb_publishable, ou migrar a chave sem ativar a RLS. Comece confirmando qual chave está no cliente e se a RLS protege suas tabelas.

    Resposta rápida

    A migração troca as chaves antigas (anon e service_role) pelo novo formato (sb_publishable e sb_secret), e o risco principal é usar a chave errada no lugar errado. Segundo a documentação de chaves da Supabase, a sb_publishable é pública e destinada ao cliente, enquanto a sb_secret ignora a RLS e deve ficar apenas no servidor. Em apps criados com IA, o código gerado pode inserir a chave errada ou omitir a Row Level Security. Primeiro, confirme que apenas a sb_publishable está no cliente e que a RLS protege cada tabela. Se a sb_secret vazou, rotacione-a imediatamente.

    O que significa a migração para sb_publishable?

    A migração significa substituir as chaves de API antigas da Supabase pelo novo formato, no qual a sb_publishable ocupa o lugar da antiga chave anon e a sb_secret ocupa o lugar da service_role. As chaves antigas serão descontinuadas, por isso a Supabase recomenda adotar o novo formato. Do ponto de vista de segurança, o papel de cada chave permanece o mesmo: uma é pública e a outra é secreta.

    O importante é entender que a migração não muda as regras de segurança, apenas o nome e o formato das chaves. A sb_publishable continua sendo segura para o cliente somente se a RLS estiver ativa, exatamente como a anon. A sb_secret continua sendo perigosa e exclusiva do servidor, como a service_role. Portanto, migrar corretamente é, acima de tudo, colocar cada nova chave no mesmo tipo de lugar em que a chave antiga correspondente deveria estar.

    Por que a migração é perigosa em apps com IA?

    O perigo em apps gerados com IA vem da facilidade de trocar as chaves sem entender o papel de cada uma. Ferramentas como o Lovable geram código que funciona rapidamente, mas nem sempre distinguem uma chave pública de uma secreta, de modo que, durante a migração, o assistente pode inserir a sb_secret no cliente ou deixar uma chave secreta no repositório. Como a sb_secret ignora a RLS, essa troca expõe todos os dados.

    Há ainda um risco silencioso: migrar a chave sem verificar a RLS. Se o app foi criado sem Row Level Security, trocar a anon pela sb_publishable não corrige nada, porque a proteção real sempre esteve na RLS, e não no nome da chave. Assim, a migração pode dar uma falsa sensação de modernização e segurança enquanto o problema de fundo, a ausência de RLS, permanece intacto. Tratar o código gerado como algo a revisar, e não a confiar, é essencial.

    sb_publishable vs sb_secret: a diferença crítica

    A diferença entre as duas chaves é a coisa mais importante a compreender na migração. A sb_publishable é pública por definição: ela concede apenas o papel anônimo ou autenticado, cujo acesso é limitado pelas suas políticas de RLS, e por isso pode ficar no código do cliente. É o equivalente direto da antiga chave anon.

    A sb_secret é o oposto: ela ignora a RLS por completo e tem acesso total aos dados, o que a torna equivalente à service_role. Por isso, ela deve viver somente no servidor e jamais aparecer no cliente, em um repositório ou no pacote de um app. Confundir as duas é o erro mais grave da migração: expor a sb_publishable é normal e esperado, mas expor a sb_secret é um comprometimento total, porque ignora todas as políticas que você escreveu.

    O que fazer primeiro

    O primeiro passo é identificar qual chave está no cliente e garantir que seja a sb_publishable, nunca a sb_secret. Abra o código do frontend ou do app e confirme que a chave presente é a pública. Se encontrar uma sb_secret ou uma antiga service_role no cliente, trate isso como uma emergência: remova-a e rotacione-a de imediato, pois ela pode já ter sido copiada.

    Em seguida, confirme que a Row Level Security está ativa nas tabelas que o cliente acessa. Como a sb_publishable só é segura com a RLS, verificar as políticas é tão importante quanto verificar a chave. Comece por esses dois pontos, a chave certa no cliente e a RLS ativa, porque juntos determinam se a sua migração é realmente segura ou apenas parece moderna.

    O que verificar em seguida

    Depois dos primeiros passos, verifique a cobertura completa. Percorra todas as tabelas e confirme que a RLS está ativada em cada uma que o cliente pode alcançar, e que as políticas restringem cada papel ao que ele deveria acessar. Teste consultando como o papel anônimo, usando a chave pública, para confirmar que não consegue ler nem alterar dados que deveriam estar protegidos.

    Verifique também o servidor e o histórico. Garanta que a sb_secret exista apenas em variáveis de ambiente do servidor e nunca tenha sido enviada a um repositório. Se ela apareceu em qualquer lugar acessível, rotacione-a e avalie o que ficou exposto. Essa verificação de cobertura é o que transforma uma migração aparentemente concluída em uma migração de fato segura.

    A RLS continua sendo essencial

    A Row Level Security continua sendo o verdadeiro controle de segurança, antes e depois da migração. Nenhuma mudança de formato de chave substitui a RLS, porque é ela que decide o que o papel anônimo pode ler ou escrever. Uma sb_publishable exposta sem RLS é tão perigosa quanto uma chave anon exposta sem RLS: qualquer pessoa com a chave pública alcança todos os dados.

    Por isso, ative a RLS em todas as tabelas acessíveis pelo cliente e escreva políticas de menor privilégio, permitindo, por exemplo, que cada usuário acesse apenas suas próprias linhas. Ative a RLS primeiro, pois uma tabela sem ela fica aberta independentemente de qualquer política. Teste como o papel anônimo para confirmar que as restrições realmente se aplicam, transformando uma suposição de segurança em um fato verificado.

    Quando escalar ou rotacionar

    A escalada aqui significa rotacionar chaves e avaliar a exposição, e o momento de agir é imediato quando uma chave secreta aparece onde não deveria. Se a sb_secret, ou a antiga service_role, foi para o cliente, um repositório ou o pacote de um app, considere-a comprometida e rotacione-a sem demora, gerando uma nova e removendo a exposta. Rotacionar é o passo que realmente protege, porque apagar o arquivo depois não desfaz uma exposição já ocorrida.

    Já a exposição da sb_publishable não é uma emergência, desde que a RLS esteja correta, pois ela foi feita para ser pública. Portanto, priorize a rotação da chave secreta e a verificação da RLS. Avalie quais dados estiveram acessíveis e por quanto tempo, para saber se há também uma obrigação de comunicação. Só então a migração pode ser considerada realmente encerrada.

    Chaves e RLS comparadas

    Ver as chaves lado a lado esclarece onde cada uma pertence. A tabela a seguir resume o papel de cada chave e onde ela deve ficar.

    ChavePode ser exposta?Onde usar
    sb_publishableSim, com RLS ativaNo cliente e no frontend
    sb_secretNuncaApenas no servidor
    Legada anonDescontinuada, migrarEquivalente à sb_publishable
    Legada service_roleNunca no clienteMigrar, apenas no servidor

    Leia a tabela como uma regra de colocação. A chave pública e sua equivalente antiga vão no cliente, com RLS; a chave secreta e sua equivalente antiga ficam apenas no servidor. Uma chave secreta no cliente está sempre errada, seja no formato novo ou no antigo.

    Lista de verificação

    Uma verificação curta confirma que a migração foi segura. A lista a seguir cobre os pontos essenciais.

    VerificaçãoAçãoFeito
    Tipo de chaveConfirmar que apenas a sb_publishable está no cliente[ ]
    Segredo no clienteGarantir que a sb_secret não vazou[ ]
    RLS ativaAtivar a Row Level Security em todas as tabelas[ ]
    Testar como anônimoConfirmar que o acesso está restrito[ ]
    RotacionarRotacionar qualquer chave secreta exposta[ ]

    As duas verificações mais importantes são garantir que a sb_secret nunca esteja no cliente e que a RLS esteja ativa e testada. Juntas, elas determinam se a migração tornou o app seguro ou apenas mudou o nome das chaves.

    Verifique com um scanner

    Corrigir a RLS protege o back-end, mas vale verificar também o app que você distribui, pois o mesmo padrão de criação rápida que troca chaves sem cuidado pode embarcar uma chave secreta na compilação. Esse é o caso perigoso, e não a chave pública, e é fácil passar despercebido em um pacote grande.

    Um scanner como o PTKD.com analisa a compilação do seu app e retorna resultados ordenados por gravidade e associados ao OWASP MASVS, incluindo segredos embutidos no binário, para que você confirme que nenhuma chave secreta foi distribuída. Para deixar claro o limite: o PTKD não configura a sua RLS nem migra as suas chaves. Ele verifica o artefato distribuído, complementando o trabalho de RLS que realmente protege os dados.

    O que levar em conta

    • A migração troca as chaves antigas pelo novo formato, mas não muda as regras: a sb_publishable é pública e a sb_secret é secreta.
    • Em apps com IA como o Lovable, o maior risco é colocar a sb_secret no cliente ou migrar sem ativar a Row Level Security.
    • A sb_publishable só é segura com a RLS ativa; trocar a chave não corrige a ausência de RLS.
    • Primeiro, confirme que apenas a sb_publishable está no cliente e que a RLS protege cada tabela; rotacione qualquer chave secreta exposta.
    • Verifique a compilação com o PTKD.com para garantir que nenhuma chave secreta tenha sido embarcada no app.
    • #supabase
    • #sb_publishable
    • #lovable
    • #row level security
    • #migração de chaves

    Frequently asked questions

    O que significa a migração para sb_publishable?
    Significa substituir as chaves antigas da Supabase pelo novo formato, no qual a sb_publishable ocupa o lugar da anon e a sb_secret ocupa o lugar da service_role. As chaves antigas serão descontinuadas. A migração não muda as regras de segurança, apenas o nome e o formato: a sb_publishable continua pública e a sb_secret continua secreta e exclusiva do servidor.
    Por que a migração é perigosa em apps com IA?
    Porque ferramentas como o Lovable geram código rapidamente sem sempre distinguir uma chave pública de uma secreta, podendo inserir a sb_secret no cliente ou deixar uma chave secreta no repositório, o que expõe todos os dados por ignorar a RLS. Há ainda o risco de migrar a chave sem ativar a RLS, dando uma falsa sensação de segurança.
    Qual é a diferença entre sb_publishable e sb_secret?
    A sb_publishable é pública, concede apenas o papel anônimo ou autenticado limitado pelas suas políticas de RLS, e pode ficar no cliente, sendo equivalente à anon. A sb_secret ignora a RLS por completo, tem acesso total aos dados e deve viver apenas no servidor, sendo equivalente à service_role. Expor a sb_secret é um comprometimento total.
    O que devo fazer primeiro na migração?
    Identifique qual chave está no cliente e garanta que seja a sb_publishable, nunca a sb_secret. Se encontrar uma sb_secret ou service_role no cliente, remova-a e rotacione-a de imediato. Em seguida, confirme que a Row Level Security está ativa nas tabelas acessíveis pelo cliente, pois a sb_publishable só é segura com a RLS.
    O que verificar em seguida?
    Confirme a cobertura completa: RLS ativa em todas as tabelas alcançáveis pelo cliente, com políticas de menor privilégio, e teste consultando como o papel anônimo para verificar que não acessa dados protegidos. Garanta que a sb_secret exista apenas no servidor e nunca tenha ido para um repositório; se apareceu, rotacione-a e avalie o que ficou exposto.
    Quando devo escalar ou rotacionar as chaves?
    Imediatamente quando uma chave secreta aparece onde não deveria. Se a sb_secret foi para o cliente, um repositório ou o pacote de um app, considere-a comprometida e rotacione-a sem demora, pois apagar o arquivo depois não desfaz a exposição. A exposição da sb_publishable não é emergência, desde que a RLS esteja correta, pois ela é pública por definição.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free