前端<->后端:安全条带集成



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

import stripe
stripe.key = "API_KEY"
def wrap_create_customer():
return stripe.create_customer()

显然,有可能只是逆向工程我的后端API,并开始调用它来读取客户数据,处理收费等。实际上,Stripe API是通过我的后端公开的,因为前端-后端连接是公共的。(就像所有后端启动代码在条纹教程)。

如何保护客户端-后端通信?

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

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

需要Stripe Secret key的唯一原因是验证请求。为什么不直接在条纹仪表板中添加允许的起源,而不是需要密钥?

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

Q3:我应该采取哪些步骤来拥有一个安全的客户端<->后端集成,这样我的后端就可以保证知道请求确实是由客户端发出的。(客户端是前端应用)。

通常情况下,(我从来没有特别使用过stripe,但与其他类似的提供商)这是这样工作的:

  • 前端包含一个SDK,该SDK使用vendorIdproductIds进行初始化。这个信息没有什么秘密。因为即使别人知道,他唯一能做的就是从你的stripe账号里买东西。

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

  • 一旦结帐完成,支付提供商调用您的后端的webhook向您发送有关客户的所有必要信息(姓名,购买的物品,交易id,…)

  • 你在后端处理这些信息,并将其存储在某个地方。例如,可以通过事务id

    向前端提供一些信息
  • 前端也将从SDK获得事务id,因此它可以使用此事务id查询后端。你想要/需要向前端暴露什么信息完全取决于你。

通常,绝对不需要通过API暴露后端和支付提供者之间的任何其他通信,更不用说将数据从支付提供者转发到前端了。特别是,如果任何人都可以在没有身份验证的情况下访问您的API。当然,您可能还需要一些管理API访问,但我们同意,这肯定是由一些强认证保护的。

为了防止恶意用户对您的Stripe帐户进行欺诈/滥用(例如Card Testing),您需要保护一些Stripe供电的端点。Stripe确实推荐了几种缓解措施,包括用户身份验证、速率限制等。验证码。取决于您的应用程序&在商业上,你可能需要其中几个的组合。

请注意,用户身份验证可以使用各种自托管或第三方工具添加到静态站点。GatsbyJS有一个很好的文档,里面有很多例子。几乎任何纯客户端技术都可以被欺骗(例如origin, referrer等),因此仅靠这些技术不足以保护您的后端服务器。

最新更新