【发布时间】:2015-04-02 11:26:27
【问题描述】:
我将创建 Stripe 网络挂钩并想知道如何确保安全性,以便只有 Stripe 可以访问我的 URL?
我正在将 Laravel 与 Stripe 库一起使用。
【问题讨论】:
-
你没有令牌的东西吗...?
标签: php stripe-payments webhooks
我将创建 Stripe 网络挂钩并想知道如何确保安全性,以便只有 Stripe 可以访问我的 URL?
我正在将 Laravel 与 Stripe 库一起使用。
【问题讨论】:
标签: php stripe-payments webhooks
如the documentation中所述:
如果担心安全性,或者如果确认 Stripe 发送了 webhook 很重要,您应该只使用在 webhook 中发送的 ID,并且应该直接从 Stripe API 请求剩余的详细信息。我们还建议您通过记录您收到的事件来防止重放攻击,并且永远不要两次处理事件。
换句话说,无法确认请求的来源。因此,不要信任它的任何数据,任何给定项目的 ID 除外。然后,您自己联系 Stripe API,询问具有给定 id 的项目。这样您就知道从哪里获取数据,而 webhook 调用本质上只是一个通知,让您知道您应该使用 API 签入。
【讨论】:
实际上,您可以将对 webhook 的访问限制为仅对 Stripe IP。这就是 Stripe 更新 webhook 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。
【讨论】:
Stripe 对它发送给您的事件进行签名,因此您可以验证签名以检查 Stripe 是发件人。
Stripe 库将为您处理此问题,包括防止重放攻击。请参阅https://stripe.com/docs/webhooks/signatures 的文档。有一个PHP示例。
幂等性是另一回事。您可能会多次收到事件,这是您需要处理的问题(通过跟踪事件 ID)。此页面上提到了这一点:https://stripe.com/docs/webhooks/best-practices。
【讨论】: