Segurança de Webhooks

Como validar que as notificações recebidas foram enviadas pelo Vero e não por um terceiro mal-intencionado.

Recomendado

Sempre valide a assinatura do webhook antes de processar qualquer alteração de estado no seu banco de dados ou libertar encomendas.

Cabeçalho X-Vero-Signature

Cada webhook enviado pelo Vero inclui um cabeçalho chamado X-Vero-Signature, no formato sha256=<hmac>. Esta assinatura é um HMAC-SHA256 gerado a partir do corpo cru (raw) do pedido e do teu Webhook Secret.

verify.ts
import crypto from 'crypto'

function verifyWebhook(rawBody: string, signatureHeader: string, secret: string) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex')

  const a = Buffer.from(signatureHeader)
  const b = Buffer.from(expected)
  if (a.length !== b.length) return false

  // timingSafeEqual evita ataques de temporização - nunca uses ===
  return crypto.timingSafeEqual(a, b)
}
Prevenção de Replay

Verifique se o timestamp do evento não tem mais de 5 minutos de diferença do tempo actual para evitar ataques de replay.