前端 <-> 后端:Secure Stripe 集成
Frontend <-> Backend: Secure Stripe Integration
我的后端代码通常包装客户端调用并通过这样的端点公开它们:
import stripe
stripe.key = "API_KEY"
def wrap_create_customer():
return stripe.create_customer()
显然,可以对我的后端 API 进行逆向工程,然后开始调用它来读取客户数据、处理费用等。实际上,Stripe API 通过我的后端公开,因为前端-后端连接是public。 (就像 Stripe 教程中的所有后端起始代码一样)。
如何保护客户端-后端通信?
我的前端是一个 public 静态站点。它未通过后端进行身份验证。为了防止来自国外的请求,我要求请求的来源属于我的网站域。
问:但如果这是解决方法,则意味着验证来源将是识别请求真正所有者的充分条件。那为什么 Stripe 不让我们把代码完全移到客户端呢?
需要 Stripe Secret 密钥的唯一原因是对请求进行身份验证。为什么不直接在 Stripe 仪表板的某处添加允许的来源而不需要密钥?
Q2:后端代码背后的全部原因是简单地从 public 中隐藏 Stripe Live 密钥吗?即使可以通过 'non-secure' 个端点访问后端?
Q3:我应该采取什么步骤来进行安全的客户端 <-> 后端集成,以便保证我的后端知道请求确实是由客户端发出的。 (客户端为前端应用)
通常情况下,(我从来没有特别使用过 stripe,但使用过其他类似的供应商)其工作方式如下:
前端包含一个 SDK,它使用 vendorId
初始化,可能还有一些 productIds
。这些信息没有什么秘密。因为即使其他人认识他们,他唯一能做的就是从你的条纹账户购买物品。
当要进行结帐时,客户端向支付提供商[=38]发送checkout/{venderId}/{productId}
请求=].一些供应商只提供“结帐链接”,客户被重定向到供应商系统上托管的安全页面。这会处理所有与付款相关的事情(信用卡的安全输入,......你真的不想知道客户的信用卡信息!)
结帐完成后,支付提供商 会调用您的 后端 的网络钩子,向您发送所有必要的信息有关客户的信息(姓名、购买的商品、交易 ID,...)
您在后端处理该信息,并将其存储在某个地方。例如,您可以通过事务 ID
向前端提供一些信息
fontend 也会从 SDK 获取交易 ID,因此它可以使用此交易 ID 查询您的后端。您 want/need 向前端公开哪些信息完全取决于您。
通常,绝对没有必要通过 API 公开您的后端和支付提供商之间的任何其他通信,更不用说将数据从支付提供商转发到前端了。特别是,如果任何人无需身份验证即可访问您的 API。当然,您可能还需要一些管理 API 访问权限,但我们同意,这肯定受到一些强身份验证的保护。
为了防止 fraud/abuse(例如 Card Testing) of your Stripe account by malicious users, you'll want to protect some of your Stripe-powered endpoints. Stripe does recommend several mitigations,包括用户身份验证、速率限制和验证码。根据您的应用程序和业务,您可能需要组合使用其中的几个。
请注意,可以使用各种自托管或第三方支持的工具将用户身份验证添加到静态站点。 GatsbyJS 有一些非常好的 documentation 这方面的多个示例。几乎任何纯客户端技术都可以被欺骗(例如来源、引荐来源网址等),因此仅靠这些技术不足以保护您的后端服务器。
我的后端代码通常包装客户端调用并通过这样的端点公开它们:
import stripe
stripe.key = "API_KEY"
def wrap_create_customer():
return stripe.create_customer()
显然,可以对我的后端 API 进行逆向工程,然后开始调用它来读取客户数据、处理费用等。实际上,Stripe API 通过我的后端公开,因为前端-后端连接是public。 (就像 Stripe 教程中的所有后端起始代码一样)。
如何保护客户端-后端通信?
我的前端是一个 public 静态站点。它未通过后端进行身份验证。为了防止来自国外的请求,我要求请求的来源属于我的网站域。
问:但如果这是解决方法,则意味着验证来源将是识别请求真正所有者的充分条件。那为什么 Stripe 不让我们把代码完全移到客户端呢?
需要 Stripe Secret 密钥的唯一原因是对请求进行身份验证。为什么不直接在 Stripe 仪表板的某处添加允许的来源而不需要密钥?
Q2:后端代码背后的全部原因是简单地从 public 中隐藏 Stripe Live 密钥吗?即使可以通过 'non-secure' 个端点访问后端?
Q3:我应该采取什么步骤来进行安全的客户端 <-> 后端集成,以便保证我的后端知道请求确实是由客户端发出的。 (客户端为前端应用)
通常情况下,(我从来没有特别使用过 stripe,但使用过其他类似的供应商)其工作方式如下:
前端包含一个 SDK,它使用
vendorId
初始化,可能还有一些productIds
。这些信息没有什么秘密。因为即使其他人认识他们,他唯一能做的就是从你的条纹账户购买物品。当要进行结帐时,客户端向支付提供商[=38]发送
checkout/{venderId}/{productId}
请求=].一些供应商只提供“结帐链接”,客户被重定向到供应商系统上托管的安全页面。这会处理所有与付款相关的事情(信用卡的安全输入,......你真的不想知道客户的信用卡信息!)结帐完成后,支付提供商 会调用您的 后端 的网络钩子,向您发送所有必要的信息有关客户的信息(姓名、购买的商品、交易 ID,...)
您在后端处理该信息,并将其存储在某个地方。例如,您可以通过事务 ID
向前端提供一些信息fontend 也会从 SDK 获取交易 ID,因此它可以使用此交易 ID 查询您的后端。您 want/need 向前端公开哪些信息完全取决于您。
通常,绝对没有必要通过 API 公开您的后端和支付提供商之间的任何其他通信,更不用说将数据从支付提供商转发到前端了。特别是,如果任何人无需身份验证即可访问您的 API。当然,您可能还需要一些管理 API 访问权限,但我们同意,这肯定受到一些强身份验证的保护。
为了防止 fraud/abuse(例如 Card Testing) of your Stripe account by malicious users, you'll want to protect some of your Stripe-powered endpoints. Stripe does recommend several mitigations,包括用户身份验证、速率限制和验证码。根据您的应用程序和业务,您可能需要组合使用其中的几个。
请注意,可以使用各种自托管或第三方支持的工具将用户身份验证添加到静态站点。 GatsbyJS 有一些非常好的 documentation 这方面的多个示例。几乎任何纯客户端技术都可以被欺骗(例如来源、引荐来源网址等),因此仅靠这些技术不足以保护您的后端服务器。