Skip to content

feat(webhook): verificação de frescor opcional (anti-replay) em verifyWebhookSignature - #4

Merged
Gabrielmoraesp merged 1 commit into
mainfrom
fix/webhook-anti-replay
Jul 2, 2026
Merged

Gabrielmoraesp merged 1 commit into
mainfrom
fix/webhook-anti-replay

Conversation

@Gabrielmoraesp

Copy link
Copy Markdown
Contributor

Contexto

Parte da remediação de segurança do webhook de saída (achado F13 da auditoria de lógica de negócio da API). A assinatura HMAC prova autenticidade, mas não frescor — uma entrega assinada capturada poderia ser reenviada (replay).

O backend agora assina id (UUID) + sentAt dentro do corpo. Este PR dá ao SDK Node a primitiva para o receptor rejeitar entregas obsoletas.

Mudança

verifyWebhookSignature(rawBody, signatureHeader, secret, opts?) ganha um 4º parâmetro opcional:

verifyWebhookSignature(body, sig, secret, { toleranceSeconds: 300 })

Quando toleranceSeconds é informado, após validar o HMAC o helper também rejeita se sentAt estiver fora da janela. Aditivo e retrocompatível: sem o parâmetro, o comportamento é idêntico ao anterior (só assinatura). A assinatura HMAC não mudou → golden vector permanece válido.

Deduplicar por id (no corpo) para idempotência continua sendo responsabilidade do receptor.

Follow-up

Replicar o mesmo toleranceSeconds nos SDKs Python/Go/PHP.

🤖 Generated with Claude Code

…yWebhookSignature

Aceita `{ toleranceSeconds }`: após validar o HMAC, rejeita entregas cujo
`sentAt` (no corpo assinado) esteja fora da janela. Aditivo e retrocompatível
(sem o param, comportamento idêntico). Pareado com o backend, que agora assina
`id` + `sentAt` no corpo; deduplique por `id` para idempotência.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Gabrielmoraesp
Gabrielmoraesp merged commit 7cedfbe into main Jul 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant