Zum Hauptinhalt springen

Webhook-Sicherheit

Jede Webhook-Anfrage von ConsentForge enthält eine HMAC-SHA256-Signatur. Überprüfen Sie diese Signatur, bevor Sie den Payload verarbeiten, um sicherzustellen, dass die Anfrage echt ist und nicht manipuliert wurde.

Anfrage-Header

HeaderBeschreibung
X-ConsentForge-SignatureHMAC-SHA256-Hex-Digest von {timestamp}.{body}
X-ConsentForge-TimestampUnix-Zeitstempel (Sekunden), wann das Ereignis gesendet wurde
X-ConsentForge-Delivery-IDEindeutige ID für diese Zustellung (zur Idempotenz verwenden)

Überprüfungsalgorithmus

  1. X-ConsentForge-Timestamp aus dem Anfrage-Header lesen
  2. X-ConsentForge-Signature aus dem Anfrage-Header lesen
  3. Den Signatur-String erstellen: {timestamp}.{raw_request_body}
  4. HMAC-SHA256 des Signatur-Strings mit Ihrem Webhook-Geheimnis berechnen
  5. (Timing-sicher) mit der empfangenen Signatur vergleichen
  6. Ablehnen, wenn der Zeitstempel mehr als 5 Minuten alt ist (Replay-Schutz)

Codebeispiele

function verifyConsentForgeWebhook(
string $rawBody,
string $signature,
string $timestamp,
string $secret
): bool {
// Ablehnen wenn zu alt (5 Minuten)
if (abs(time() - (int)$timestamp) > 300) {
return false;
}

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

return hash_equals($expected, $signature);
}

// Verwendung in einem Laravel-Controller:
$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();

Idempotenz

Verwenden Sie X-ConsentForge-Delivery-ID, um wiederholte Zustellungen zu deduplizieren. Speichern Sie verarbeitete Zustellungs-IDs und überspringen Sie Duplikate.

Geheimnis rotieren

So rotieren Sie Ihr Webhook-Geheimnis:

  1. Generieren Sie ein neues Geheimnis im Dashboard (altes Geheimnis ist noch 24 Stunden aktiv)
  2. Aktualisieren Sie Ihren Server auf das neue Geheimnis
  3. Nach 24 Stunden wird das alte Geheimnis ungültig