# 組み込みに関するセキュリティガイド PCI 準拠を確認し、顧客とサーバーの通信を保護します。 [Payment Card Industry Data Security Standard](https://www.pcisecuritystandards.org/pci_security/) (PCI DSS) は、カード会員データまたは機密認証データを保存、処理、または送信するすべての組織を対象としたグローバルなセキュリティ標準です。PCI DSS は、消費者に対する保護のベースラインレベルを設定し、決済エコシステム全体にわたる不正利用とデータ侵害を低減します。カードデータの処理、送信、または保存に関与する者は、PCI DSS に準拠する必要があります。 ## PCI 準拠の検証 PCI 準拠は共同責任であり、Stripe とお客様の会社の両方に以下の要件が適用されます。 - Stripe は、すべての PCI 要件を満たす[PCI レベル 1](https://www.visa.com/splisting/searchGrsp.do?companyNameCriteria=stripe,%20inc) のサービスプロバイダーとして PCI Qualified Security Assessor (QSA) から毎年認定を受けています。 - 支払いを受け付ける企業は、PCI に準拠した方法で支払いを受け付け、毎年この遵守状況を証明する必要があります。 [ダッシュボード](https://dashboard.stripe.com/settings/compliance/documents)で会社のドキュメント要件を確認し、このガイドを読み進めて、Stripe が PCI 準拠に関してどのようなサポートを提供しているかをご確認ください。 ## 低リスクのシステムを使用する 一部のビジネスモデルでは、決済画面でトークン化されていない PAN を受け取る必要があります。もし貴社の事業が決済時に機密性の高いクレジットカードデータを直接取り扱う場合、PCI DSS で定められた 300 を超えるセキュリティコントロールを満たす必要があるかもしれません。これには、専用のセキュリティソフトウェアやハードウェアの購入、導入、維持、そして年間評価要件をサポートする外部監査人の雇用が必要になることがあります。 多くのビジネスモデルでは、機密性の高いカードデータを扱う必要はありません。代わりに、Stripe が提供する低リスクの[決済システム](https://docs.stripe.com/payments.md)でサーバーを経由せずに支払い情報を安全に収集して Stripe に直接送信できるため、PCI の要件を緩和できます。 ### 安全に保存できる対象外のカードデータ Stripe は支払いリクエストに対するレスポンスとして、機密情報以外のカード情報を返します。この情報にはカードタイプ、カードの末尾 4 桁、カードの有効期限が含まれます。この情報は PCI 準拠の対象ではないため、これらのプロパティはいずれもデータベースに保存できます。さらに、[API](https://docs.stripe.com/api.md) によって返される情報もすべて保存可能です。 ## TLS と HTTPS を使用する TLS とは、クライアント (顧客が使用しているアプリまたはブラウザー) とお客様のサーバーとの間で安全にデータを送信するプロセスを指します。これは当初、Secure Sockets Layer (SSL) プロトコルが実行しましたが、古くなり安全ではなくなりました。TLS が SSL に置き換わりましたが、「SSL」という用語は、 TLS とその送信データを保護する機能を表すときに話し言葉で引き続き使用されています。 支払いページでは、お客様と顧客の両方に対する中間者攻撃のリスクを削減するため、最新バージョン (TLS 1.2 以上) を使用する必要があります。TLS は次の達成を目指しています。 - クライアントとサーバー間のトラフィックを暗号化し、その整合性を検証します。 - クライアントが正しいサーバーと通信していることを確認してください。実際には、これはドメインの所有者とサーバーの所有者が同じエンティティであることの検証を意味し、中間者攻撃の防止に役立ちます。この検証が行われないと、正しい受信者へのトラフィックを暗号化していることが保証されません。 [混合コンテンツの警告](https://web.dev/what-is-mixed-content/)が顧客のブラウザーに表示されないようにするため、すべてのリソース (JavaScript、CSS、画像など) についても、TLS 経由で提供されるようにしてください。 TLS を使用するには、認証局 (CA) が発行するファイルである「デジタル証明書」が必要です。この証明書をインストールすると、クライアントが、なりすましではなく通信先として想定されるサーバーと実際に通信していることが保証されます。デジタル証明書は、次のような定評のある証明書プロバイダーから取得します。 - [Let’s Encrypt](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) し、本番環境で決済を受け付ける準備ができたときに HTTPS を有効にすることができます。ただし、お客様のサーバーと Stripe 間のやり取り (Stripe のライブラリの使用時など) にはすべて HTTPS を使用する必要があります。 ### TLS を設定する TLS を設定するには次のようにします。 1. 適切なプロバイダーから証明書を購入します。 1. 証明書が使用されるようにサーバーを構成します。この手順は複雑なため、使用するプロバイダーのインストールガイドに従ってください。 TLS は一連の複雑な暗号化ツールであるため、詳細を見過ごしてしまいがちです。Qualys SSL Labs が提供している [SSL Server Test](https://www.ssllabs.com/ssltest/) を使用して、すべてが安全に設定されたことを確認することをお勧めします。 ## セキュリティに関する考慮事項 他のサイトから JavaScript を取り込むと、セキュリティが他のサイトに依存するようになり、セキュリティリスクが生じる可能性があります。そのサイトが侵害された場合、攻撃者がお客様のページで任意のコードを実行する可能性があります。実際には、多くのサイトが Google アナリティクスのようなサービスに JavaScript を使用していて、安全なページもあります。それでもなお、これを最小限に抑えることが重要です。 *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 によってのみ送信されるようにする必要があります。 データセキュリティ標準に準拠することは重要ですが、セキュリティを常に考慮する必要があります。Web セキュリティを理解するのに役立つリソースを以下に示します。 - [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)を導入している場合、Checkout、Connect 埋め込みコンポーネント、Stripe.js に必要なディレクティブの一覧は次のとおりです。 #### 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 ファイルを使用して Connect の埋め込みコンポーネントで使用する[ウェブフォント](https://docs.stripe.com/connect/get-started-connect-embedded-components.md#fonts-object)を読み込む場合は、その 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)を読み込む場合は、その URL がお客様の [connect-src](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/connect-src) CSP ディレクティブで許可されている必要があります。 リダイレクト機能を備えた決済手段 ( 3D セキュアや iDeal を必要とするカードなど) を使用する場合は、`frame-src` ディレクティブとして `https://hooks.stripe.com` を含めます。 自社の Google Maps API キーとともに [Address Element](https://docs.stripe.com/elements/address-element.md) を使用する場合は、connect-src および script-src ディレクティブに `https://maps.googleapis.com` を含めます。最新の CSP 要件については、[Google Maps API 公式ガイド](https://developers.google.com/maps/documentation/javascript/content-security-policy)をご覧ください。 [Trusted Types](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; }, }); ``` ### クロスオリジン分離のサポート 現在、*クロスオリジン分離サイト* (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)