// Vulnerabilidade e correção
IDOR em checkout Stripe
O que é IDOR no contexto de checkout
IDOR (Insecure Direct Object Reference) é quando trocar um identificador — na URL, no corpo ou num parâmetro — devolve um objeto que não é seu. No checkout, isso vira acesso a pedido, sessão de pagamento, fatura, recibo ou assinatura de outro cliente.
É a falha número um de controle de acesso quebrado justamente porque é fácil de introduzir: o código busca pelo id recebido e esquece de checar se o usuário atual é o dono daquele registro.
Onde ela aparece com Stripe
A integração é segura; o buraco costuma estar na sua camada, entre a sua sessão e o objeto do Stripe.
- Rota que recupera uma Checkout Session ou PaymentIntent pelo id sem checar o dono.
- Endpoint de recibo/fatura que aceita qualquer id de invoice.
- Página de sucesso que confia num session_id da URL para liberar acesso.
- Portal de assinatura que edita a subscription por id recebido do cliente.
Como corrigir
A correção é sempre a mesma: valide a posse no servidor. Nunca confie que "conhecer o id" prova que a pessoa pode ver aquele objeto. E não use o session_id da URL como prova de pagamento — confirme pelo webhook ou consultando o Stripe pelo lado servidor.
- Guarde a relação usuário↔objeto e cheque em toda leitura/escrita.
- Prefira ids opacos e não sequenciais, mas sem depender só disso (não é controle de acesso).
- Libere acesso pago só após confirmação real (webhook assinado), não pela página de sucesso.
- Escopo por tenant em cima do escopo por usuário.
Quando isso pede prova manual
IDOR em fluxo de pagamento é exatamente o tipo de achado que trava venda B2B e vira notícia ruim. Quando o impacto toca receita e dado de cliente, uma prova manual com escopo autorizado (Pentest Manual) mostra o que quebra, com evidência controlada e prioridade de correção.
Perguntas frequentes
Usar UUID em vez de id sequencial resolve IDOR?
Reduz a chance de adivinhar, mas não é correção. IDOR é falta de verificação de dono. Se a rota não checa quem pode ver o objeto, um id vazado (em log, referer, print) ainda expõe o dado.
A página de sucesso do Stripe pode liberar o acesso?
Não como fonte de verdade. O session_id na URL de sucesso não prova pagamento. Confirme pelo webhook assinado ou consultando o Stripe no servidor antes de liberar plano.
Como sei se meu checkout tem IDOR?
Crie duas contas, faça um pedido em cada e tente acessar o objeto de uma usando a sessão da outra (trocando ids). Se voltar dado, é IDOR. Em fluxo de receita, vale validar com teste manual.