Construir um app com IA é incrível — até você subir ele para a internet sem proteção. E esse é o momento mais perigoso do caminho: a IA, no modo construtor, foca em fazer o app FUNCIONAR, não em como ele pode ser atacado. Resultado: apps lindos onde qualquer um pode ver os dados de outro usuário mudando um número na URL, APIs que qualquer site do mundo pode chamar, e navegadores sem instruções de defesa. Este guia cobre as 3 fechaduras que mais são esquecidas — RLS, CORS e headers de segurança — com uma analogia para cada uma, o risco real, e um prompt detalhado que você cola na sua IA para ela configurar por você. Você não precisa saber como funciona por dentro: só como cada coisa se chama e quando colocá-la.
O momento é claro e não negociável: logo antes de publicar seu app ou entregá-lo a usuários reais. Enquanto você testa sozinho no seu computador, não acontece nada. Mas no segundo em que o seu app está na internet com dados de outras pessoas, sem essas fechaduras você está expondo tudo. E como a IA não faz isso sozinha (ela está pensando em fazer funcionar, não em proteger), cabe a você pedir explicitamente.
Sem RLS, um usuário malicioso só precisa mudar um ID na URL ou em uma requisição para ver os dados de outra pessoa. É a vulnerabilidade mais comum em apps com Supabase e PostgreSQL — e a mais fácil de explorar. Por isso é a fechadura #1.
Estou usando Supabase com PostgreSQL. Tenho estas tabelas: [liste suas tabelas e suas colunas de usuário, ex: posts (user_id), comments (post_id, user_id)]. Configure Row-Level Security para que cada usuário só possa ver/editar/apagar seus próprios registros. Siga as melhores práticas oficiais do Supabase: - Ative RLS em TODAS as tabelas (ENABLE ROW LEVEL SECURITY). - Crie políticas SEPARADAS para SELECT, INSERT, UPDATE e DELETE (NÃO use FOR ALL). - IMPORTANTE para o desempenho: envolva a função de usuário como (SELECT auth.uid()), NÃO auth.uid() solto, para que o Postgres a avalie uma única vez por consulta e não uma vez por linha. - Restrinja as políticas ao papel authenticated (TO authenticated), não a public, para que os visitantes anônimos nem toquem na tabela. - NUNCA use user_metadata nas políticas (o usuário pode modificá-lo). - Adicione índices nas colunas que as políticas usam (ex. user_id). - Lembre-se: para que um UPDATE funcione, também é necessária uma política de SELECT. - Me dê o SQL completo pronto para colar no SQL Editor do Supabase, e me explique em uma linha o que cada política faz.
auth.uid() direto na política. MAS isso faz o Postgres avaliá-lo uma vez para cada linha — em uma tabela de 100.000 linhas, a diferença é entre uma consulta de 5 milissegundos e uma de 5 segundos! O truque (documentado pelo Supabase): escreva como `(SELECT auth.uid())`. Assim é avaliado uma única vez. Por isso o prompt acima pede isso explicitamente.Configure CORS no meu backend para que SOMENTE meu domínio de produção (https://meu-app.com) e localhost em desenvolvimento possam fazer requisições. - NÃO use "*" como origem permitida em produção. - Permita apenas os métodos que eu realmente uso (ex. GET, POST, PUT, DELETE). - Permita apenas os cabeçalhos que eu preciso. - Me explique exatamente onde colocar cada coisa de acordo com o meu stack: [me diga seu framework/backend].
Access-Control-Allow-Origin: * com credenciais ativadas. É como deixar a porta aberta e colocar um cartaz dizendo "entrem, deixei as chaves dentro". Se a sua IA configurou assim "para funcionar rápido", conserte antes de publicar.Adicione os headers de segurança recomendados ao meu app: Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Strict-Transport-Security (HSTS) e Permissions-Policy. - Me explique o que cada um faz em uma linha simples. - Me dê a configuração pronta para o meu framework: [me diga qual você usa, ex. Next.js, Express]. - Comece a Content-Security-Policy em modo report-only para não quebrar nada, e me diga como reforçá-la depois. - Me diga como verificar o resultado.
* com credenciais.Join 4,200+ builders. No credit card. Build your first app with AI in minutes.