【问题标题】:How to ensure security in Stripe webhooks?如何确保 Stripe webhook 的安全性?
【发布时间】:2015-04-02 11:26:27
【问题描述】:

我将创建 Stripe 网络挂钩并想知道如何确保安全性,以便只有 Stripe 可以访问我的 URL?

我正在将 Laravel 与 Stripe 库一起使用。

【问题讨论】:

  • 你没有令牌的东西吗...?

标签: php stripe-payments webhooks


【解决方案1】:

如the documentation中所述:

如果担心安全性,或者如果确认 Stripe 发送了 webhook 很重要,您应该只使用在 webhook 中发送的 ID,并且应该直接从 Stripe API 请求剩余的详细信息。我们还建议您通过记录您收到的事件来防止重放攻击,并且永远不要两次处理事件。

换句话说,无法确认请求的来源。因此,不要信任它的任何数据,任何给定项目的 ID 除外。然后,您自己联系 Stripe API,询问具有给定 id 的项目。这样您就知道从哪里获取数据,而 webhook 调用本质上只是一个通知,让您知道您应该使用 API 签入。

【讨论】:

  • 它并不能完全防止犯规行为,但仅限制对条带列表的 IP 地址的访问,例如 Carlos Devia 的回答,提供了额外的强大保护层。攻击者需要从这些 IP 中进行欺骗或破坏其中一个,这两者都将是一项巨大的壮举。我认为最佳实践(Stripe 的文档与此相呼应)将同时做到这一点以及您在此处提出的建议。
  • 白名单 IP 的问题是 Stripe 必须对该名单的稳定性提供巨大的保证,或者需要一种方法来跟上它。但是,是的,如果有的话,当然可以。
  • 列表在这里发布:stripe.com/files/ips/ips_webhooks.txt,更多文档和更多列表可以在这里找到:stripe.com/docs/ips
  • 我同意只信任 ID,然后通过 API 调用检索其余数据是最佳做法。令我惊讶的是,Stripe 官方文档中的大部分内容都相反地指示用户。我也想知道为什么他们甚至首先提供事件的所有信息。它不仅鼓励用户采用直接使用给定数据的不太安全的方法,而且在最佳实践的情况下,它还会产生不必要的开销,发送大量数据,这些数据将被丢弃然后重新检索.
  • TLS 确保发送者发送的内容没有被修改,因此我们在传输层有完整性保证。 HMAC 签名还确保只能使用预先共享的密钥,否则您对该签名的验证将失败,因此您在应用程序层进行了额外的完整性检查。此外,当您不信任该秘密时,您还假设 Stripe 已被盗用,因此您认为 TLS 证书也被盗用的可能性更小。如果这些分层保证不足以让您信任,那么您已经决定不再信任 Stripe
【解决方案2】:

实际上,您可以将对 webhook 的访问限制为仅对 Stripe IP。这就是 Stripe 更新 webhook ips 列表的原因。

https://stripe.com/docs/ips

我只是为一个使用 Laravel 和 Stripe 的项目做的。您可以执行以下操作:

//Only accept connections from stripe ips.


    //Save stripe info for 24 hours for performance.
    $stripe_webhooks_ips = Cache::remember('stripe_webhooks_ips', 1440, function()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_URL, 'https://stripe.com/files/ips/ips_webhooks.json');
        $result = curl_exec($ch);
        curl_close($ch);

        $json_result = json_decode($result,true);

        return $json_result['WEBHOOKS'];
    });



    if(in_array($_SERVER['REMOTE_ADDR'],$stripe_webhooks_ips)) {
        //Your Code Here.
    }

关于 remote_addr 变量的安全性: Is it safe to trust $_SERVER['REMOTE_ADDR']?

如果您使用代理或 Cloudfare 等 CDN 服务,请记住采取额外措施来获取源 IP。

【讨论】:

    【解决方案3】:

    Stripe 对它发送给您的事件进行签名,因此您可以验证签名以检查 Stripe 是发件人。

    Stripe 库将为您处理此问题,包括防止重放攻击。请参阅https://stripe.com/docs/webhooks/signatures 的文档。有一个PHP示例。

    幂等性是另一回事。您可能会多次收到事件,这是您需要处理的问题(通过跟踪事件 ID)。此页面上提到了这一点:https://stripe.com/docs/webhooks/best-practices。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2013-04-20
      • 2018-07-28
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      相关资源
      最近更新 更多