以下是CSRF令牌验证的安全实施吗?具体来说,我想调用此Stripe API端点:
https://connect.stripe.com/express/oauth/authorize?redirect_uri=https://example.com&client_id=ca_11111&state={STATE_VALUE}
而条纹文档说
要防止CSRF攻击,请添加state参数,并将唯一标记作为值传递。当我们将用户重定向回您的网站时,我们会包含您提供给我们的州。
我正在考虑像这样实施:
- 浏览器生成随机令牌并将其存储在cookie(或本地存储)中
- 浏览器调用上述端点
- 条带重定向到https://example.com
处的应用程序
- 当我收到回复时,我会检查state
参数的内容,并将其与存储在本地存储或我的cookie中的值进行比较。
这是CSRF的安全/正确实施吗?或者我是否需要以某种方式涉及后端服务?
答案 0 :(得分:0)
请注意,在Stripe自己在NodeJS中编写的Rocket Ride示例中,状态只是在服务器上以随机字符串形式计算并添加到用户会话中。当Stripe在redirect_uri响应时,它们只是将用户会话中的状态与响应中包含的状态进行比较。以下两个代码段摘自以下内容-https://github.com/stripe/stripe-connect-rocketrides/blob/master/server/routes/pilots/stripe.js
/**
* GET /pilots/stripe/authorize
*
* Redirect to Stripe to set up payments.
*/
router.get('/authorize', pilotRequired, (req, res) => {
// Generate a random string as `state` to protect from CSRF and include it in the session
req.session.state = Math.random()
.toString(36)
.slice(2);
// more stuff below
});
然后进行检查-
/**
* GET /pilots/stripe/token
*
* Connect the new Stripe account to the platform account.
*/
router.get('/token', pilotRequired, async (req, res, next) => {
// Check the `state` we got back equals the one we generated before proceeding (to protect from CSRF)
if (req.session.state != req.query.state) {
return res.redirect('/pilots/signup');
}
// more stuff below
});