Sicurezza Webhooks
Proteggi i tuoi webhook endpoint verificando l'autenticità delle richieste.
Firma HMAC
Ogni richiesta include una firma HMAC-SHA256:
X-BladeCRM-Signature: sha256=abc123def456...Verificare la Firma
1. Ottieni il Secret
Quando crei un webhook, viene generato un secret. Copialo e conservalo in modo sicuro.
2. Calcola la Firma
python
import hmac
import hashlib
def verify_signature(payload, signature, secret):
expected = 'sha256=' + hmac.new(
secret.encode(),
payload.encode(),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)3. Confronta
Se le firme corrispondono, la richiesta è autentica.
Esempi
Node.js
javascript
const crypto = require('crypto');
function verifyWebhook(payload, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload, 'utf8')
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}
app.post('/webhook', (req, res) => {
const signature = req.headers['x-bladecrm-signature'];
const payload = JSON.stringify(req.body);
if (!verifyWebhook(payload, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}
// Processa il webhook
res.status(200).send('OK');
});PHP
php
function verifyWebhook($payload, $signature, $secret) {
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
return hash_equals($expected, $signature);
}
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_BLADECRM_SIGNATURE'];
if (!verifyWebhook($payload, $signature, WEBHOOK_SECRET)) {
http_response_code(401);
exit('Invalid signature');
}
// Processa il webhook
http_response_code(200);Best Practices
- ✅ Verifica sempre la firma
- ✅ Usa timing-safe comparison
- ✅ Conserva il secret in modo sicuro
- ✅ Usa HTTPS per l'endpoint
- ✅ Rigenerale il secret periodicamente
Rigenerare il Secret
Se pensi che il secret sia compromesso:
- Impostazioni → Webhooks
- Seleziona il webhook
- Rigenera Secret
- Aggiorna il secret nel tuo server
WARNING
Non saltare la verifica della firma. Senza, chiunque potrebbe inviare richieste false al tuo endpoint.