CSRF实施和条带API

时间:2018-04-24 21:38:34

标签: web stripe-payments csrf

以下是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的安全/正确实施吗?或者我是否需要以某种方式涉及后端服务?

(条纹文档:https://stripe.com/docs/connect/express-accounts

1 个答案:

答案 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
});