如何确保Stripe webhooks的安全性?

时间:2015-02-03 09:57:08

标签: php stripe-payments webhooks

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

我正在使用Laravel和Stripe库。

3 个答案:

答案 0 :(得分:13)

the documentation中所述:

  

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

换句话说,无法确认请求的来源。因此,不要相信任何数据,除了任何给定项目的ID 。然后,您自己联系Stripe API,询问具有给定ID的项目。通过这种方式,您可以知道从哪里获取数据,并且webhook调用基本上只是一个通知,通知您应该使用API​​进行检查。

答案 1 :(得分:2)

实际上,您可以将对网络挂钩的访问权限仅限于条带IP。这就是Stripe有一个webhooks 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。

答案 2 :(得分:0)

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

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

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