# 安全

> 验证 Webhook 的真实性

import WebhookSignatureJS from '/snippets/zh/v2/webhook-signature/js.mdx';
import WebhookSignaturePython from '/snippets/zh/v2/webhook-signature/python.mdx';

通过检查每个 Webhook 请求的 HMAC-SHA256 签名，验证它确实来自 Firecrawl。这可以防止攻击者伪造 payload，并让你在处理数据之前确认其可信性。

<div id="secret-key">
  ## 密钥
</div>

你的 webhook 密钥可在账户设置中的 [Advanced 选项卡](https://www.firecrawl.dev/app/settings?tab=advanced) 找到。每个账户都有一个唯一的密钥，用于为所有 webhook 请求签名。

<Warning>
  请妥善保管你的 webhook 密钥，切勿公开泄露。如果你认为
  密钥已遭泄露，请立即在账户设置中重新生成。
</Warning>

<div id="signature-verification">
  ## 签名验证
</div>

每个 webhook 请求都会包含一个名为 `X-Firecrawl-Signature` 的请求头：

```
X-Firecrawl-Signature: sha256=abc123def456...
```


<div id="how-to-verify">
  ### 如何验证
</div>

1. 从 `X-Firecrawl-Signature` 头中提取签名
2. 获取原始请求体（不要先解析）
3. 使用你的密钥计算 HMAC-SHA256
4. 使用时间安全的比较函数比较签名

<div id="implementation">
  ### 实现
</div>

<CodeGroup>

<WebhookSignatureJS />

<WebhookSignaturePython />

</CodeGroup>

<div id="best-practices">
  ## 最佳实践
</div>

* **验证每个请求。** 在处理 Webhook 负载之前，始终先检查签名。对于任何未通过验证的请求，返回 `401` 状态并予以拒绝。
* **使用时间安全的比较。** 标准字符串比较可能泄露时间信息。在 Node.js 中使用 `crypto.timingSafeEqual()`，在 Python 中使用 `hmac.compare_digest()`。
* **通过 HTTPS 提供你的端点。** 这样可确保 Webhook 负载在传输过程中被加密。
