Hành vi gửi
Lấy từ tài liệu của chính hãng, kiểm tra lần cuối 2026-08-06. Hãng không nêu con số nào thì bảng này cũng không ghi.
| Thời hạn phản hồi | hãng không công bố |
|---|---|
| Thử lại | hãng không công bố |
| Ngừng gửi | hãng không công bố |
Chữ ký
Kiểm chứng bằng một bộ xác minh chạy thật, có bộ test chứng minh, chứ không đọc từ tài liệu. Kiểm chứng lần cuối 2026-08-20.
| Thuật toán | HMAC-SHA256 |
|---|---|
| Payload được ký | raw body, no timestamp |
| Encoding | hex |
| Header | sentry-hook-signature |
| Dung sai | không quy định |
Xác minh
Dùng raw body của request, đúng từng byte, trước mọi bước parse JSON. Mọi cơ chế trên trang này đều hỏng ngay khi framework serialize lại payload.
const crypto = require("node:crypto");
// hex(HMAC-SHA256(client secret, raw body)) — no timestamp anywhere
const expected = crypto
.createHmac("sha256", clientSecret) // Settings → Developer Settings
.update(rawBody)
.digest("hex");
const received = Buffer.from(req.headers["sentry-hook-signature"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
received.length === wanted.length && crypto.timingSafeEqual(received, wanted);Những chỗ dễ vấp
Không có gì trong payload được ký hết hạn: không có dấu thời gian nghĩa là một request bị bắt được vẫn xác minh trơn tru sau một tháng như lúc mới gửi. Khi kẻ tấn công phát lại request đó, chỉ có idempotency (xử lý nhiều lần vẫn cho cùng một kết quả) ở phía bạn mới ngăn được side effect chạy lại.
Đọc thêm
AnyHook đứng trước các endpoint nhận webhook từ Sentry: trả lời sau khoảng 1 giây, tự thử lại theo lịch riêng khi server của bạn ngừng hoạt động, và giữ mọi sự kiện để bạn phát lại được. Đổi một URL, giữ nguyên code.