Skip to main content

使用 Webhook 的最佳做法

在使用 Webhook 时遵循以下最佳做法以提高安全性和性能。

订阅的事件数应尽可能少

应仅订阅需要的 Webhook 事件。 这可减少服务器需要完成的工作量。 有关订阅事件的详细信息,请参阅“创建网络钩子”和“测试 Webhook”。

使用 Webhook 机密

警告

为避免意外泄露敏感信息,请勿在有效负载 URL 中包含敏感信息****。 这包括你自己的 API 密钥和其他身份验证凭据。 相反,为了验证 webhook 的交付确实由 GitHub 发送且未被篡改,请使用 webhook 密钥。 有关详细信息,请参阅“验证 Webhook 交付”。

Webhook 密钥应选择高熵的随机文本字符串。 应以服务器可以访问的方式安全存储 Webhook 密钥。

使用 HTTPS 和 SSL 验证

应确保服务器使用 HTTPS 连接。 默认情况下, GitHub 在传送 Webhook 时,将验证 SSL 证书。 GitHub 建议启用 SSL 验证。

在 10 秒内响应

服务器应在收到 Webhook 传递后的 到 30 秒内响应 2XX 状态码。 如果服务器花费的时间超过响应时间,则 GitHub 终止连接,并考虑传递失败。

为了及时响应,您可能需要设置一个队列来异步处理 webhook 数据负载。 服务器可以在收到 Webhook 时进行响应,然后在后台处理有效负载,而不阻止未来的 Webhook 传递。 例如,可以使用Hookdeck等服务或ResqueRQ(Python),或RabbitMQ(Java)等库。

在处理事件之前检查事件类型和操作

Webhook 事件类型有多种,并且许多事件都可以有多个操作类型。 GitHub 继续向现有事件类型添加新事件类型和新操作。 在处理 Webhook 有效负载之前,应用程序应检查该有效负载的事件类型和操作。 若要确定事件类型,可以使用 X-GitHub-Event 请求标头。 要确定操作类型,可以在事件负载中使用顶级 action 键。

重新投递未送达的件

如果服务器出现故障,应在服务器备份后重新传递遗漏的 Webhook。 有关详细信息,请参阅“重新传递 Webhook”。

使用 X-GitHub-Delivery 标头

在重播攻击中,不良参与者截获 Webhook 交付并重新发送交付。 若要防止重播攻击,可以使用 X-GitHub-Delivery 标头来确保每个事件的传递都是唯一的。

注意

如果请求重新传送,X-GitHub-Delivery 标头将与原始传递中的标头相同。

其他阅读材料

  •         [AUTOTITLE](/rest/guides/best-practices-for-integrators)
    
  •         [AUTOTITLE](/apps/creating-github-apps/about-creating-github-apps/best-practices-for-creating-a-github-app)