我会创建Stripe Web挂钩,并想知道如何确保安全性,以便只有Stripe可以访问我的URL?
我正在使用Laravel和Stripe库。
答案 0 :(得分:13)
如the documentation中所述:
如果担心安全问题,或者确认Stripe发送了webhook很重要,您应该只使用您的webhook中发送的ID,并应直接从Stripe API请求剩余的详细信息。我们还建议您通过记录您收到的事件来防范重放攻击,并且永远不会处理事件两次。
换句话说,无法确认请求的来源。因此,不要相信任何数据,除了任何给定项目的ID 。然后,您自己联系Stripe API,询问具有给定ID的项目。通过这种方式,您可以知道从哪里获取数据,并且webhook调用基本上只是一个通知,通知您应该使用API进行检查。
答案 1 :(得分:2)
实际上,您可以将对网络挂钩的访问权限仅限于条带IP。这就是Stripe有一个webhooks 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。