以下是CSRF令牌验证的安全实现吗?具体来说,我想调用此Stripe API端点:
https://connect.stripe.com/express/oauth/authorize?redirect_uri=https://example.com&client_id=ca_11111&state={STATE_VALUE}
和Stripe文档说
为了防止CSRF攻击,请添加状态参数,并将唯一标记作为值传递。当我们将用户重定向回您的网站时,我们将包含您提供的状态。
我正在考虑这样实现:-浏览器生成随机令牌并将其存储在Cookie(或本地存储)中-浏览器调用上述端点-条带重定向到我在https://example.com
处的应用程序-收到响应后,我会检查state
参数的内容并将其与本地存储或cookie中存储的值进行比较。
这是CSRF的安全/正确实施吗?还是我需要以某种方式涉及后端服务?
注意,在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
});