# 集成安全指南

确保客户端和服务器之间的通讯符合 PCI 规定且安全。

[支付卡行业数据安全标准](https://www.pcisecuritystandards.org/pci_security/) (PCI DSS) 是一项全球安全标准，适用于所有存储、处理或传输持卡人数据或敏感认证数据的实体。PCI DSS 为消费者设定了基准保护水平，有助于在整个支付生态系统中减少欺诈和数据泄露事件。任何涉及处理、传输或存储银行卡数据的主体都必须遵守 PCI DSS。

## 验证您的 PCI 合规性

PCI 合规是一项共同责任，Stripe 及贵商家都要为之负责：

- Stripe 每年由独立 PCI 合格安全评估机构 (QSA) 认定为满足所有 PCI 要求的 [PCI 1 级](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe,%20inc)服务提供商。
- 作为接受付款的商家，您必须以符合 PCI 标准的方式进行付款，并每年证明其合规性。

在[管理平台](https://dashboard.stripe.com/settings/compliance/documents)中查看贵商家的文档要求，并继续阅读本指南，了解 Stripe 如何帮助您实现 PCI 合规。

## 使用低风险集成应用

一些业务模式需要在支付页面上接收未令牌化的 PAN。如果您的企业在接受付款时直接处理敏感的信用卡数据，则可能需要满足 PCI DSS 中超过 300 项安全控制要求。这可能需要您购买、实施和维护专用的安全软硬件，并聘请外部审计师来支持您的年度评估需求。

许多业务模式不需要处理敏感的银行卡数据。相反，您可以使用我们的低风险[支付集成](https://docs.stripe.com/payments.md)之一来安全地收集支付信息并将其直接传输给 Stripe，无需通过您的服务器，从而减少您的 PCI 义务。

### 您可以安全存储的银行卡数据

Stripe 在对收款请求的响应中返回非敏感的银行卡信息。包括卡的类型、卡的后四位数字和有效期。此信息不受 PCI 合规性的约束，因此可将这些属性中的任何一个存储在数据库中。此外，您可以存储我们的 [API](https://docs.stripe.com/api.md) 返回的任何内容。

## 使用 TLS 和 HTTPS

TLS 是指在客户端（您的客户使用的应用程序或浏览器）与您的服务器之间安全传输数据的过程。安全套接层 (SSL) 协议最初执行此功能，但已经过时且不再安全。TLS 已经代替了 SSL，但在提及 TLS 及其保护传输数据的功能时，仍通俗地使用术语 *SSL*。

支付页面必须使用近期版本（TLS 1.2 或以上），因为它可以显著降低您和您的客户遭受中间人攻击的风险。TLS 会尝试完成以下工作：

- 加密并验证客户端和服务器之间流量的完整性。
- 验证客户端能够与正确的服务器通讯。实际上，这通常就等于是验证了域名的所有者和服务器的所有者是同一个实体。这有助于防止中间人攻击 (Man-in-the-Middle Attack)。否则，就不能保证您将流量加密到正确的接收者。

确保任何资源（例如，JavaScript、CSS 和图片等）也使用 TLS 协议，避免您的客户在他们的浏览器中看到[混合内容警告](https://web.dev/what-is-mixed-content/)。

使用 TLS 需要_数字证书_——由认证中心 (CA) 发行的文件。安装该证书可向客户端保证，它实际上在与它期望与之对话的服务器通信，而非冒名顶替者。从信誉良好的证书提供商处获取数字证书，例如：

- [我们进行加密](https://letsencrypt.org/)
- [DigiCert](https://www.digicert.com/tls-ssl/basic-tls-ssl-certificates)
- [NameCheap](https://www.namecheap.com/security/ssl-certificates.aspx)

如有需要，您可以在不使用 HTTPS 的情况下[测试您的集成](https://docs.stripe.com/testing.md)，并在准备接受真实交易时再启用。但是，您的服务器与 Stripe 之间的所有交互都必须使用 HTTPS（即在使用我们的库时）。

### 设置 TLS

如何设置 TLS：

1. 从合适的提供商处购买证书。
2. 将服务器配置为使用证书。该步骤很复杂，因此请遵循所用提供商的安装指南。

由于 TLS 是一套复杂的加密工具，因此很容易遗漏一些细节。建议您使用 Qualys SSL Labs 的 [SSL Server Test](https://www.ssllabs.com/ssltest/)，确保您以安全的方式设置所有内容。

## 安全考虑

包含来自其他网站的 JavaScript 会使您的安全性依赖于他们的安全性，并带来安全风险。如果它们的安全性遭到威胁，攻击者可能会在您的页面执行任意的代码。实际上，许多网站甚至在安全页面上使用 JavaScript 来提供 Google Analytics 等服务。尽管如此，我们建议尽量减少它。

如果您正在使用*Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests)，请为端点启用 TLS，以避免流量被拦截和通知被篡改（敏感信息绝不会包含在 Webhook 事件中）。您还必须[验证 Webhook 签名](https://docs.stripe.com/webhooks.md#verify-official-libraries)，并[将 Stripe 的 IP 地址加入允许列表](https://docs.stripe.com/ips.md)，以确保您收到的每个 Stripe Webhook 均由 Stripe 独家发送。

虽然遵守《数据安全标准》很重要，但这不应该就此停止考虑安全性问题。以下这些资源可帮助您了解网络安全：

- [OWASP](https://owasp.org/)
- [SANS](https://www.sans.org/reading-room/)
- [NIST](http://csrc.nist.gov/)

### 内容安全政策

如果您部署了*内容安全策略* (Content Security Policy (CSP) is an added layer of security that helps to detect and mitigate certain types of attacks, including Cross-Site Scripting (XSS) and data injection attacks)，Stripe 产品的完整指令集为：

#### Checkout

- `connect-src`, `https://checkout.stripe.com`
- `frame-src`, `https://checkout.stripe.com`
- `script-src`, `https://checkout.stripe.com`
- `img-src`, `https://*.stripe.com`

#### Connect 嵌入式组件

- `frame-src`，`https://connect-js.stripe.com`, `https://js.stripe.com`
- `img-src`，`https://*.stripe.com`
- `script-src`，`https://connect-js.stripe.com`, `https://js.stripe.com`
- `style-src`，`sha256-0hAheEzaMe6uXIKV4EehS9pu1am1lj/KnnzrOYqckXk=`（空样式元素的 SHA）

如果您使用 CSS 文件加载 [Web 字体](https://docs.stripe.com/connect/get-started-connect-embedded-components.md#fonts-object)以用于 Connect 嵌入式组件，其 URL 必须被您的 [connect-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src) CSP 指令允许。

#### Stripe.js

- `connect-src`、`https://api.stripe.com`、`https://maps.googleapis.com`
- `frame-src`, `https://*.js.stripe.com`, `https://js.stripe.com`, `https://hooks.stripe.com`
- `script-src`, `https://*.js.stripe.com`, `https://js.stripe.com`, `https://maps.googleapis.com`

> 添加 `*.js.stripe.com` 可使 Stripe.js 尽可能地在不同来源上启动帧来，从而提升性能。

如果您正在用 CSS 文件加载与 Elements 一起使用的[网页字体](https://docs.stripe.com/js.md#stripe_elements)，则您的 [connect-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src) CSP 指令必须允许它的 URL。

如果您使用具有重定向功能的支付方式（如，可能要求 3DS 验证的银行卡或 iDeal），请包含 `https://hooks.stripe.com`，将其作为 `frame-src` 指令。

如果您用自己的 Google Map API 密钥使用 [Address Element](https://docs.stripe.com/elements/address-element.md)，则包含 `https://maps.googleapis.com` 作为 connect-src 和 script-src 指令。有关最新的 CSP 要求，请参考 [Google Maps API 官方指南](https://developers.google.com/maps/documentation/javascript/content-security-policy)。

如果您使用的是[可信类型](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/require-trusted-types-for)，则必须允许从 `https://js.stripe.com` 和 `https://*.js.stripe.com` 加载动态脚本。您可以使用以下示例性[默认策略](https://w3c.github.io/webappsec-trusted-types/dist/spec/#default-policy-hdr) 来启用它：

```javascript
trustedTypes.createPolicy('default', {
  createScriptURL: (input) => {
    const stripeURL = /^https:\/\/([a-z0-9-]+\.)?js\.stripe\.com$/;
    const origin = new URL(input).origin;
    if (stripeURL.test(origin)) {
      return input;
    }
    return undefined;
  },
});
```

#### Link

如果您使用 [Link](https://docs.stripe.com/payments/link.md)，除了 [Stripe.js](https://docs.stripe.com/security/guide.md?csp=csp-js#csp-js) 指令之外，请添加以下指令：

- `frame-src`，`https://link.com`, `https://*.link.com`
- `connect-src`，`https://link.com`, `https://*.link.com`
- `img-src`，`https://*.link.com`

Link 的身份验证用户界面和静态资产由 Stripe 拥有的 `link.com` 子域（例如，`checkout.link.com` 和 `statics.link.com`）提供。`*.link.com` 通配符涵盖所有当前和未来的 Link 子域。

#### 加密货币

如果您使用[嵌入式加密货币入金](https://docs.stripe.com/crypto/onramp/embedded.md)，除了 [Stripe.js](https://docs.stripe.com/security/guide.md?csp=csp-js#csp-js) 指令之外，请添加以下指令：

- `script-src`，`https://crypto-js.stripe.com`
- `frame-src`，`https://crypto.link.com`
- `connect-src`，`https://crypto.link.com`

入金 JavaScript (`crypto-onramp-outer.js`) 必须直接从 `https://crypto-js.stripe.com`. 加载。请勿自行托管。入金用户界面会在由 `https://crypto.link.com`. 提供的 iframe 内渲染

如果您使用 [Stripe 托管入金](https://docs.stripe.com/crypto/onramp/stripe-hosted.md)（重定向流程），则您的页面上不需要进行其他 CSP 更改。

### 跨源隔离支持

目前，我们不支持*跨源隔离站点* (Cross-origin isolation is an opt-in security feature that helps prevent side-channel attacks by ensuring that a document loads in a unique, isolated browsing environment)。

跨源隔离需要所有依赖项的支持，而支持我们的支付产品的几个关键依赖项尚未提供对此功能的支持。

## See also

- [PCI DSS 合规](https://stripe.com/guides/pci-compliance)
- [管理秘密 API 密钥的最佳实践](https://docs.stripe.com/keys-best-practices.md)
- [Webhook](https://docs.stripe.com/webhooks.md)
- [拒绝和失败的付款](https://docs.stripe.com/declines.md)
- [争议概览](https://docs.stripe.com/disputes.md)
