为什么Stripe的webhooks不需要验证签名?

时间:2016-08-29 15:34:59

标签: php stripe-payments

doc(https://stripe.com/docs/webhooks)和SDK(stripe-php)都不使用任何签名方法。所以我怀疑,如果有人伪装成官方webhook发件人怎么办?

在SDK中,只有成功检索事件ID才会考虑一个好的webhook,我觉得风险太大,不是吗?

3 个答案:

答案 0 :(得分:3)

Stripe确实为Web挂钩提供了签名。看看这里:simple projection

您还可以查看一下这篇文章:https://stripe.com/docs/webhooks#signatures

以下是一些示例代码:

{{1}}

答案 1 :(得分:1)

您可以通过保存事件ID然后从条带检索事件来确保事件有效来解决此问题:

\Stripe\Event::retrieve($event_id)

答案 2 :(得分:1)

有两种方法可以做到这一点。它们已被覆盖,但我会将所有内容合并为一个答案。

选项1

检查事件是否有效(如果没有则抛出异常)。

\Stripe\Event::retrieve($event_id)

选项2

使用信息中心内的Stripe-Signature密钥,HMAC whsec*标题。

// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
\Stripe\Stripe::setApiKey("sk_test_XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

// You can find your endpoint's secret in your webhook settings
$endpoint_secret = "whsec_...";

$payload = @file_get_contents("php://input");
$sig_header = $_SERVER["HTTP_STRIPE_SIGNATURE"];
$event = null;

try {
  $event = \Stripe\Webhook::constructEvent(
    $payload, $sig_header, $endpoint_secret
  );
} catch(\UnexpectedValueException $e) {
  // Invalid payload
  http_response_code(400); // PHP 5.4 or greater
  exit();
} catch(\Stripe\Error\SignatureVerification $e) {
  // Invalid signature
  http_response_code(400); // PHP 5.4 or greater
  exit();
}

// Do something with $event

http_response_code(200); // PHP 5.4 or greater

来自https://stripe.com/docs/webhooks/signatures的代码

选项1更简单,需要额外调用API,但选项2要求您在应用程序中存储额外的密钥并需要代码(我更喜欢选项1)。我今天检查了Stripe支持,并且他们确认在验证API调用的有效性方面它们彼此一样好,所以这是一个选择问题。