Quando isto é feito? (o momento exato)
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.
Fechadura 1 · RLS (que cada um veja SÓ o que é seu)
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.- Crie dois usuários de teste no seu app.
- Faça login com o usuário A e crie um registro.
- Faça login com o usuário B: NÃO deve ver o registro de A.
- Verifique o Security Advisor do Supabase: ele te avisa se você deixou alguma tabela sem RLS.
Fechadura 2 · CORS (quem pode chamar sua API)
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.Fechadura 3 · Security Headers (instruções de defesa para o navegador)
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.
O hábito · revise antes de cada publicação
- RLS ativado em todas as tabelas com dados de usuários (e testado com 2 contas).
- CORS restrito aos seus domínios, nunca
*com credenciais. - Headers colocados e com nota A em securityheaders.com.
- Seus segredos (.env, chaves de API) NUNCA enviados ao GitHub (veja o guia de GitHub da série).
- Você revisou o Security Advisor do Supabase e não restam avisos em vermelho.