【问题标题】:Frontend <-> Backend: Secure Stripe Integration前端 <-> 后端:安全条带集成
【发布时间】:2021-08-29 13:36:39
【问题描述】:

我的后端代码通常包装客户端调用并通过这样的端点公开它们:

import stripe
stripe.key = "API_KEY"

def wrap_create_customer():
    return stripe.create_customer()

显然,可以对我的后端 API 进行逆向工程并开始调用它来读取客户数据、处理费用等。实际上,Stripe API 通过我的后端公开,因为前端-后端连接是公开的。 (就像 Stripe 教程中的所有后端起始代码一样)。

如何保护客户端与后端的通信?

我的前端是一个公共的静态站点。它没有通过后端进行身份验证。为了防止来自外国的请求,我要求请求的来源属于我的网络域。

问:但如果这是解决方法,则意味着验证来源将是识别请求真正所有者的充分条件。那么为什么 Stripe 不让我们将代码完全移动到客户端呢?

需要 Stripe Secret 密钥的唯一原因是对请求进行身份验证。为什么不直接在 Stripe 仪表板的某处添加允许的来源,而不需要密钥?

Q2:后端代码背后的全部原因是简单地将 Stripe Live 密钥隐藏起来吗?即使可以通过“非安全”端点访问后端?

Q3:我应该采取哪些步骤来获得一个安全的客户端后端集成,以保证我的后端知道该请求确实是由客户端发出的。 (客户端是一个前端应用程序)。

【问题讨论】:

  • 1) 检查Origin 标头绝不是验证请求来源的安全方法。它很容易被伪造...... 2)为什么你需要将所有(半敏感的)数据发送到你的前端?
  • @derpirscher 我没有向前端发送任何数据。我正在使用命中后端端点的前端,这些端点是公共的。所以基本上整个 Sripe API 都简单地包装在我的后端代码中。可以吗?
  • 你说 "...开始调用它来读取客户数据、处理费用..."不要将它从后端返回到前端?只要此敏感数据仅在条带和您的后端之间“传输”,就没有问题。当然,如果你想在前端显示一些关于最近购买的信息或类似的东西,你需要某种形式的身份验证。再次检查Origin 标头根本就不安全 ...
  • @derpirscher 前端收集数据并将此数据发送到后端端点。后端包装这些数据,添加一个 API 密钥并点击 Stripe。所以从技术上讲,“密钥”并不是那么秘密,因为任何人都可以收集相同的数据并将其发送到后端。
  • 例如,一个人可以通过点击我的后端“create_customer”端点并发送所需的数据负载在我的帐户中创建十亿新客户。

标签: stripe-payments


【解决方案1】:

为了防止恶意用户对您的 Stripe 帐户进行欺诈/滥用(例如 Card Testing),您需要保护一些由 Stripe 提供支持的端点。 Stripe 确实推荐了几个mitigations,包括用户身份验证、速率限制和验证码。根据您的应用程序和业务,您可能需要其中几种方式的组合。

请注意,可以使用各种自托管或第三方驱动的工具将用户身份验证添加到静态站点。 GatsbyJS 有一个相当不错的documentation,其中包含多个示例。几乎任何纯客户端技术都可以被欺骗(例如来源、引荐来源网址等),因此仅靠这些技术不足以保护您的后端服务器。

【讨论】:

    【解决方案2】:

    通常情况下,(我从未特别使用过 stripe,但使用过其他类似的提供程序)它的工作方式如下:

    • 前端包含一个使用vendorId 初始化的SDK,可能还有一些productIds。这个信息没有什么秘密。因为即使其他人认识他们,他唯一能做的就是从您的 Stripe 帐户购买物品。

    • 当进行结账时,客户端支付提供商发送checkout/{venderId}/{productId}请求。一些提供商只提供“结帐链接”,客户被重定向到托管在提供商系统上的安全页面。这处理所有与支付相关的东西(信用卡的安全输入,......你真的不想知道客户的信用卡信息!)

    • 结帐完成后,支付提供商会在您的后端调用 webhook,向您发送有关客户的所有必要信息(姓名、购买的商品、交易 ID、 ...)

    • 您在后端处理该信息,并将其存储在某个地方。您可以通过事务 id 向前端提供一些信息

    • fontend 也会从 SDK 获取事务 id,因此它可以使用这个事务 id 查询您的后端。您想要/需要向前端公开哪些信息完全取决于您。

    通常情况下,您完全不需要通过 API 公开您的后端和支付提供商之间的任何其他通信,更不用说将数据从支付提供商转发到前端了。特别是,如果任何人无需身份验证即可访问您的 API。当然,您可能还需要一些管理 API 访问权限,但我们同意,这肯定受到某种强身份验证的保护。

    【讨论】:

      猜你喜欢
      • 2012-09-13
      • 2014-08-07
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 2022-10-24
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多