Passa al contenuto principale

Sicurezza Webhook

Ogni richiesta webhook da ConsentForge include una firma HMAC-SHA256. Verificate questa firma prima di elaborare il payload per assicurarvi che la richiesta sia autentica e non sia stata manomessa.

Intestazioni della richiesta

IntestazioneDescrizione
X-ConsentForge-SignatureDigest esadecimale HMAC-SHA256 di {timestamp}.{body}
X-ConsentForge-TimestampTimestamp Unix (secondi) di quando l'evento è stato inviato
X-ConsentForge-Delivery-IDID univoco per questa consegna (usatelo per l'idempotenza)

Algoritmo di verifica

  1. Leggete X-ConsentForge-Timestamp dall'intestazione della richiesta
  2. Leggete X-ConsentForge-Signature dall'intestazione della richiesta
  3. Costruite la stringa di firma: {timestamp}.{raw_request_body}
  4. Calcolate HMAC-SHA256 della stringa di firma usando il vostro segreto webhook
  5. Confrontate (in modo sicuro contro gli attacchi temporali) con la firma ricevuta
  6. Rifiutate se il timestamp ha più di 5 minuti (protezione replay)

Esempi di codice

function verifyConsentForgeWebhook(
string $rawBody,
string $signature,
string $timestamp,
string $secret
): bool {
// Rifiuta se troppo vecchio (5 minuti)
if (abs(time() - (int)$timestamp) > 300) {
return false;
}

$signingString = $timestamp . '.' . $rawBody;
$expected = hash_hmac('sha256', $signingString, $secret);

return hash_equals($expected, $signature);
}

// Utilizzo in un controller Laravel:
$rawBody = $request->getContent();
$signature = $request->header('X-ConsentForge-Signature');
$timestamp = $request->header('X-ConsentForge-Timestamp');
$secret = config('services.consentforge.webhook_secret');

if (!verifyConsentForgeWebhook($rawBody, $signature, $timestamp, $secret)) {
return response('Unauthorized', 401);
}

$payload = $request->json()->all();

Idempotenza

Usate X-ConsentForge-Delivery-ID per deduplicare le consegne ripetute. Memorizzate gli ID di consegna elaborati e saltate i duplicati.

Rotazione del segreto

Per ruotare il vostro segreto webhook:

  1. Generate un nuovo segreto nel Dashboard (il vecchio segreto rimane attivo per 24h)
  2. Aggiornate il vostro server per usare il nuovo segreto
  3. Dopo 24h, il vecchio segreto viene invalidato