Recursos de Segurança de Webhooks
Para garantir a segurança e a integridade dos dados transmitidos via webhooks, nossa plataforma implementa vários recursos-chave de segurança. Essas medidas ajudam a proteger seus endpoints contra acesso não autorizado e garantir que todas as cargas úteis que você receba sejam genuínas e não adulteradas.
Gerando Solicitações Assinadas
Nossa plataforma usa assinaturas HMAC (Código de Autenticação de Mensagem Baseado em Hash) para assinar as solicitações de webhook. Isso permite que você verifique a autenticidade das solicitações que você recebe. Cada solicitação de webhook inclui uma assinatura e um carimbo de data/hora, que são usados para validar a solicitação.
Como Geramos Assinaturas
Quando nossa plataforma envia um webhook, ela gera uma assinatura usando o payload e uma chave secreta que fornecemos no processo de criação do webhook. Essa assinatura é incluída nos cabeçalhos da solicitação do webhook.
Cabeçalhos da Solicitação
Cada solicitação de webhook inclui os seguintes cabeçalhos:
x-gmz-pep-webhook-signature: A assinatura HMAC SHA-256 do payload.x-gmz-pep-webhook-timestamp: O carimbo de data/hora quando a solicitação foi gerada.
Verificando Solicitações de Webhook
Para garantir a segurança do seu endpoint de webhook, você precisa verificar a assinatura incluída em cada solicitação. Isso envolve:
- Extrair a assinatura e o carimbo de data/hora dos cabeçalhos da solicitação.
- Regenerar a assinatura em seu servidor usando o payload recebido e sua chave secreta.
- Comparar a assinatura gerada com a assinatura dos cabeçalhos da solicitação.
Exemplo de Código de Verificação (Node.js)
Aqui está um exemplo de como você pode verificar as solicitações de webhook em uma aplicação Node.js usando Express:
Mostre-me o código!
const express = require('express');
const bodyParser = require('body-parser');
const crypto = require('crypto');
const app = express();
app.use(bodyParser.json());
const signatureKey = 'sua_chave_de_assinatura_aqui';
app.post('/webhook', (req, res) => {
const payload = req.body;
const receivedSignature = req.headers['x-gmz-pep-webhook-signature'];
const receivedTimestamp = req.headers['x-gmz-pep-webhook-timestamp'];
const generatedSignature = crypto
.createHmac('sha256', signatureKey)
.update(`${receivedTimestamp}.${JSON.stringify(payload)}`)
.digest('hex');
if (receivedSignature === generatedSignature) {
// A solicitação é verificada e pode ser processada
console.log('Evento verificado recebido:', payload);
res.sendStatus(202);
} else {
// A solicitação não é verificada
console.log('Falha na verificação da assinatura');
res.sendStatus(401);
}
});
app.listen(3000, () => {
console.log('Listener de webhook em execução na porta 3000');
});
Melhores Práticas para Proteger Webhooks
Para melhorar ainda mais a segurança da sua implementação de webhook, considere as seguintes melhores práticas:
Usar HTTPS
Use sempre HTTPS para seus endpoints de webhook para garantir que os dados transmitidos entre nossa plataforma e seu servidor sejam criptografados.
Validar o Carimbo de Data/Hora
Certifique-se de que o carimbo de data/hora incluído nos cabeçalhos da solicitação seja recente. Isso ajuda a prevenir ataques de repetição onde um atacante pode tentar reenviar uma solicitação interceptada anteriormente.
Whitelist de IP
Se possível, restrinja o acesso ao seu endpoint de webhook para permitir apenas solicitações dos endereços IP da nossa plataforma.
Registro e Monitoramento
Mantenha registros das solicitações de webhook recebidas e monitore qualquer atividade incomum. Isso pode ajudá-lo a detectar e responder a incidentes de segurança potenciais.
Certifique-se de que a Resposta da sua API seja o mais rápida possível
Para evitar atrasos, sua API deve minimizar os tempos de resposta e fechar o canal de comunicação prontamente após receber o payload do seu sistema.