我正在使用Next.js应用程序中的webhooks来处理来自Stripe的客户支付事件。类似于文档中的示例,我的web钩子做的第一件事就是验证传入事件的签名:
const webhookSecret = process.env.SECRET_STRIPE_WEBHOOK
const webhookHandler = async (req, res) =>
{
if (req.method === 'POST')
{
const buf = await buffer(req)
const sig = req.headers['stripe-signature']
let event
try
{
event = stripe.webhooks.constructEvent(buf.toString(), sig, webhookSecret)
}
catch (error)
{
const errorMessage = error instanceof Error ? error.message : 'Unknown error'
// On error, log and return the error message
if (error instanceof Error) console.log(error)
console.log(`Error message: ${errorMessage}`)
res.status(400).send(`Webhook Error: ${errorMessage}`)
return
}
// The rest of the webhook
}
}但是,这些文档也提到了只有来自这些IP地址的信任事件,并提供了一个列表,其中包含了可能产生web钩子事件的IP地址。
出于安全考虑,是否还需要检查传入事件的IP地址,还是上述验证签名的实现涵盖了所有基础?docs解释说,通过Stripe的库验证签名确实可以防止重放攻击,但在同一句话中仍然提到验证IP地址。
如果验证IP地址是必要的或谨慎的事情,我如何添加到上面的实现?我在Stripe文档上找不到例子。
发布于 2022-08-15 23:36:10
验证IP地址是一个额外的安全层,以确保请求来自Stripe。几年前,这是最好的方法,因为webhook签名不存在,但是自从他们提供了这个特性之后,我认为大多数开发人员都默认使用这种方法。攻击者自己无法计算签名,尽管他们可以找到重放请求的方法。我要说的是,大多数集成都不需要考虑IP允许列表。
如果要实现这一点,则需要查看路由服务器端与请求关联的IP地址。这是用NextRequest完成的,尽管这个答案中还有其他解决方案。
https://stackoverflow.com/questions/73367246
复制相似问题