Segurança//4 min

Evite Cobranças e Créditos em Dobro

Serviços de pagamento e agendamento podem mandar o mesmo aviso mais de uma vez. Seu app precisa reconhecer a repetição antes de agir novamente.

antes de começar

Um acontecimento do cliente deve gerar um único resultado, mesmo que o aviso chegue várias vezes.

Entenda por que um acontecimento pode gerar duas ações

em palavras simples

Um serviço externo pode mandar o mesmo aviso novamente quando não recebe uma confirmação rápida do seu app.

Um cliente pode pagar uma vez e receber dois créditos na loja, dois e-mails de boas-vindas ou dois pedidos. Isso pode acontecer porque um serviço de pagamento, agenda, formulário ou entrega manda um aviso automático ao seu app quando algo ocorre. O nome técnico desse aviso enviado de um serviço para outro é webhook. Ele é útil porque o app consegue reagir sem que alguém consulte o outro serviço manualmente, mas toda reação precisa aceitar repetições com segurança.

Um aviso repetido não significa automaticamente que alguém está atacando seu app. O serviço remetente pode ter esperado uma resposta, perdido a conexão ou voltado a funcionar depois de uma manutenção. Então, manda o aviso novamente porque não sabe se a primeira cópia funcionou. Seu app deve tratar a nova cópia como um lembrete para confirmar o resultado existente, não como permissão para cobrar, creditar, reservar, enviar e-mail ou alterar o cadastro outra vez.

  • ▸Uma confirmação de pagamento deve criar um pedido.
  • ▸Uma confirmação de agendamento deve reservar um horário.
  • ▸Um reembolso aprovado deve devolver o dinheiro uma vez.

risco comum

O serviço de pagamento manda duas vezes o aviso de pagamento aprovado. O app trata as duas cópias como novas e adiciona dois créditos ao saldo do cliente.

o que fazer agora

Liste todos os serviços externos que podem iniciar uma ação para o cliente e anote exatamente o que um aviso aceito pode fazer.

peça isto à sua IA

Analise meu app e liste todos os serviços externos que enviam avisos automáticos para ele. Para cada aviso, identifique a referência exclusiva fornecida pelo serviço, a ação para o cliente que ele inicia, onde essa ação acontece e o que atualmente impede o mesmo aviso de causar a ação duas vezes. Ainda não altere o app; primeiro entregue um relatório claro.

Dê a cada aviso uma reserva que só vale uma vez

em palavras simples

Antes de fazer algo para um cliente, seu app precisa conferir se aquele aviso exato já foi tratado.

Cada aviso recebido deve trazer uma referência exclusiva criada pelo serviço remetente. Antes de criar um pedido, adicionar crédito, mudar uma assinatura ou enviar um e-mail, o app deve reservar essa referência em seus registros. Se a reserva já existir, ele deve confirmar o recebimento normalmente sem repetir a ação. O nome técnico desse comportamento é idempotência: processar novamente a mesma instrução mantém o mesmo resultado final, em vez de produzir outro resultado.

O armazenamento organizado usado pelo app recebe o nome técnico de banco de dados. Salve nele o nome do serviço, a referência exclusiva, o horário de chegada, a situação do trabalho e o resultado final. O nome técnico da regra que proíbe uma segunda referência igual é restrição de unicidade. Use a referência fornecida pelo serviço, não o e-mail, o nome do cliente, o valor da compra ou o horário atual. Um cliente pode fazer várias compras legítimas, e pessoas diferentes podem ter nomes ou valores iguais.

  • ▸Salve juntos o nome do serviço e a referência do aviso.
  • ▸Marque o trabalho como novo, iniciado, concluído, rejeitado ou aguardando revisão.
  • ▸Deixe o próprio armazenamento impor a regra de uma única referência.

risco comum

O app usa o e-mail do cliente para identificar repetições. Assim, ignora uma segunda compra legítima e ainda deixa passar algumas duplicidades verdadeiras.

o que fazer agora

Crie um registro permanente para cada aviso e uma regra de armazenamento que recuse outra reserva do mesmo serviço e da mesma referência.

peça isto à sua IA

Implemente tratamento idempotente para todos os avisos recebidos de serviços externos. Antes de criar ou alterar pedido, cobrança, reembolso, crédito, assinatura, agendamento, cadastro ou e-mail, salve o nome do serviço e a referência exclusiva enviada por ele. Adicione no banco de dados uma restrição de unicidade que cubra os dois valores. Se a reserva já existir, confirme o recebimento sem repetir a ação. Registre os estados novo, iniciado, concluído, rejeitado e precisa de revisão.

Confirme o remetente e recuse cópias antigas

em palavras simples

Um aviso precisa comprovar de onde veio antes que seu app o trate como uma instrução.

Uma mensagem pode afirmar que o pagamento foi aprovado sem ter vindo da empresa de pagamento. Serviços confiáveis acrescentam uma comprovação protegida que o app pode conferir antes de alterar dinheiro ou informações de clientes. O nome técnico dessa conferência é verificação de assinatura. O serviço fornece ao app uma senha de assinatura, também chamada de segredo de assinatura, que permite distinguir um aviso verdadeiro de outro inventado ou alterado. Uma comprovação ausente ou inválida não deve causar nenhuma ação.

O processo em um computador que executa o trabalho protegido do app longe dos visitantes é chamado pelos desenvolvedores de servidor. Guarde a senha de assinatura apenas nas configurações desse servidor, nunca em arquivos enviados ao aparelho de um visitante. Quando o serviço incluir um horário de envio confiável, aceite somente um intervalo curto e documentado. O nome técnico para impedir o reenvio de um aviso verdadeiro e antigo é proteção contra replay. Confirmar o remetente e reconhecer repetições são cuidados necessários, pois um serviço legítimo também pode reenviar um aviso legítimo.

  • ▸Confira a comprovação protegida do serviço antes de agir.
  • ▸Recuse avisos sem comprovação, alterados, inválidos ou antigos demais.
  • ▸Mantenha a senha de assinatura longe dos arquivos entregues aos visitantes.

risco comum

Um app aceita qualquer mensagem enviada ao endereço de avisos de pagamento e marca a conta como paga sem confirmar o remetente.

o que fazer agora

Use o método oficial de conferência do serviço remetente e aplique o intervalo de tempo recomendado antes de tratar o aviso como instrução.

peça isto à sua IA

Revise todos os lugares em que meu app recebe avisos automáticos de serviços externos. Antes de alterar cadastro, pedido, pagamento, reembolso, crédito, agendamento, assinatura ou e-mail, verifique o aviso com o método oficial de assinatura do serviço. Mantenha cada segredo de assinatura apenas nas configurações de ambiente do servidor, recuse assinaturas ausentes ou inválidas, aplique a tolerância de horário recomendada pelo serviço e não grave segredos de assinatura em registros ou mensagens de erro.

Prepare o app para duas cópias que chegam juntas

em palavras simples

Dois avisos iguais podem chegar tão próximos que uma consulta seguida de gravação deixa ambos continuarem.

Imagine duas pessoas consultando a mesma lista no mesmo instante. As duas encontram uma linha vazia, escrevem o próprio nome e fazem o trabalho. Um app comete o mesmo erro quando primeiro pergunta se uma referência existe e só depois a salva. As duas cópias podem passar pela consulta antes que qualquer uma registre a reserva. Esse problema de tempo é especialmente importante quando há dinheiro, vagas limitadas, estoque, créditos ou mensagens para clientes.

A reserva precisa acontecer como uma única etapa que não pode ser dividida. O nome técnico dessa etapa indivisível é operação atômica. Deixe o banco de dados aceitar uma reserva e recusar a outra por meio da restrição de unicidade. Marque o trabalho aceito como iniciado antes de executar a ação para o cliente. Se ele parar no meio, mantenha uma situação de trabalho incompleto e detalhes não sensíveis para uma revisão controlada. Não repita uma cobrança ou um crédito sem saber o resultado anterior.

  • ▸Reserve a referência em uma única etapa indivisível.
  • ▸Permita que somente a reserva vencedora execute a ação.
  • ▸Encaminhe resultados incertos ou incompletos para revisão.

risco comum

Dois avisos idênticos chegam com poucos milésimos de segundo de diferença. Ambos passam por uma consulta separada e cada um adiciona o mesmo crédito mensal.

o que fazer agora

Envie dois avisos iguais ao mesmo tempo em uma configuração segura de testes e confirme que acontece exatamente uma ação para o cliente.

peça isto à sua IA

Torne segura a reserva de avisos quando duas cópias idênticas chegarem ao mesmo tempo. Use uma operação atômica no banco de dados e uma restrição de unicidade para nome do serviço mais referência do aviso. Somente a solicitação que criar a reserva pode executar a ação. A duplicada deve confirmar o recebimento sem repetir nada. Se a solicitação vencedora parar no meio, marque precisa de revisão e não repita automaticamente cobrança, reembolso, crédito, agendamento ou e-mail com resultado incerto.

Mantenha registros e teste após cada mudança importante

em palavras simples

Registros claros e testes de repetição ajudam a encontrar uma proteção ausente antes que o cliente veja resultados duplicados.

Mantenha um histórico curto com nome do serviço, referência do aviso, horário de chegada, resultado da conferência, situação do trabalho e resultado final. O nome técnico desses registros é logs. Não coloque neles senhas de clientes, números completos de cartões, senhas de assinatura ou conteúdos desnecessários das mensagens. Revise regularmente os trabalhos repetidos, rejeitados, incompletos ou com falha. Uma mudança fora do normal pode revelar conexão quebrada, problema na confirmação do remetente ou uma alteração recente que removeu a reserva única.

Após mudar pagamentos, cadastros, agendas, entregas ou automações, envie duas vezes o mesmo aviso de teste aprovado e confirme que aparece apenas um resultado. Depois, teste um aviso inválido e outro antigo, confirmando que nenhum deles altera informações de clientes. O nome técnico das verificações repetidas ao longo do tempo é monitoramento contínuo. O VibeCodeWall confere o app público por fora e acompanha mudanças importantes ao longo do tempo. Ele não vê as instruções internas do app nem substitui os registros e testes feitos dentro dele.

  • ▸Teste repetições aprovadas, avisos inválidos, avisos antigos e cópias simultâneas.
  • ▸Revise trabalhos incompletos antes de repetir algo que afete dinheiro ou acesso de clientes.
  • ▸Execute as verificações novamente após mudanças relacionadas.

risco comum

Uma mudança no processo de pagamento substitui o antigo recebimento de avisos, e a nova versão cria pedidos antes de verificar se o aviso já foi concluído.

o que fazer agora

Crie um teste de segurança repetível para cada serviço importante e execute-o após toda mudança relacionada.

peça isto à sua IA

Crie e execute um plano seguro de testes automáticos para cada serviço externo que envia avisos ao meu app. Teste um aviso válido, o mesmo aviso válido duas vezes, duas cópias iguais enviadas ao mesmo tempo, uma assinatura inválida, um horário vencido e uma falha depois que o trabalho começar. Confirme que a entrada válida cria exatamente um resultado, a entrada rejeitada não altera nada, o trabalho incompleto fica marcado para revisão e nenhum registro contém senha, segredo de assinatura, número completo de cartão ou informação desnecessária de clientes.

Checklist rápido

  1. 01Liste todos os serviços externos que enviam avisos ao seu app.
  2. 02Anote qual ação para o cliente cada tipo de aviso pode causar.
  3. 03Guarde a referência exclusiva enviada com cada aviso.
  4. 04Crie uma regra de armazenamento que impeça duas reservas da mesma referência.
  5. 05Confirme quem enviou o aviso antes de alterar pedido, pagamento, crédito ou cadastro.
  6. 06Mantenha a senha de assinatura do serviço longe dos arquivos baixados por visitantes.
  7. 07Recuse avisos verdadeiros, mas antigos demais, quando o serviço informar o horário de envio.
  8. 08Teste dois avisos iguais chegando quase ao mesmo tempo.
  9. 09Registre trabalhos aceitos, repetidos, rejeitados e incompletos sem guardar senhas ou números completos de cartão.
  10. 10Repita os testes após mudanças em pagamentos, agendamentos, cadastros ou automações.

FAQ

Avisos repetidos sempre indicam um ataque?

Não. É comum um serviço tentar novamente quando não recebe uma confirmação rápida. Seu app deve lidar com segurança tanto com novas tentativas normais quanto com mensagens repetidas de propósito.

Posso usar o e-mail do cliente para reconhecer um aviso repetido?

Não. O mesmo cliente pode fazer várias compras ou reservas legítimas. Use a referência exclusiva criada pelo serviço remetente.

O que fazer quando a primeira tentativa para no meio?

Registre que o trabalho ficou incompleto e faça uma revisão controlada. Não repita automaticamente uma cobrança, devolução, crédito, reserva ou mensagem quando o primeiro resultado for incerto.

Confirmar o remetente é suficiente?

Não. Um serviço legítimo pode mandar o mesmo aviso verdadeiro mais de uma vez. O app precisa confirmar o remetente e também impedir que uma referência já reservada cause outra ação.