メインコンテンツへスキップ
Diditが750万ドルを調達、本人確認と不正対策のインフラを構築
Didit
ブログ一覧へ
ブログ2026年3月14日

iFrameセキュリティのベストプラクティス:ウェブ開発者のための必須ガイド (JA)

iFrameはコンテンツ埋め込みに強力なツールですが、適切に扱わないと重大なセキュリティリスクを招きます。このガイドでは、サンドボックス化やコンテンツセキュリティポリシーなど、iFrameを安全に利用するための重要なベストプラクティスを解説します。.

By Didit更新日
embedded-iframe-security-best-practices.png

iFrameをサンドボックス化する常にsandbox属性を使用してiFrameの機能を制限し、信頼できないコンテンツがスクリプトを実行したり、ローカルストレージにアクセスしたり、フォームを送信したりするのを防ぎます。

堅牢なCSPを実装するコンテンツセキュリティポリシー(CSP)ヘッダーを利用して、ページがロードおよび実行できるリソースを制御し、特にiFrameをターゲットにして混合コンテンツの問題やスクリプトインジェクションを防ぎます。

X-Frame-Options & CSP Frame-Ancestorsを活用するX-Frame-OptionsDENYまたはSAMEORIGINに設定することで、クリックジャッキングからサイトを保護します。モダンブラウザでは、CSPのより詳細なframe-ancestorsディレクティブを使用します。

外部コンテンツには注意を払うiFrameを介して埋め込むサードパーティコンテンツは、そのセキュリティ慣行を暗黙的に信頼することになるため、徹底的に検証してください。強力なセキュリティ保証を提供するソリューションや、サーバーサイド処理を可能にするソリューションを優先してください。

iFrameの諸刃の剣:利便性 vs. セキュリティ

iFrame(インラインフレーム)は、開発者が他のソースからのコンテンツをウェブページにシームレスに埋め込むことを可能にする、現代のウェブ開発に不可欠な要素です。YouTubeの動画、決済ゲートウェイ、ソーシャルメディアウィジェット、本人確認フローなど、iFrameは比類のない柔軟性を提供します。しかし、この力には重大なセキュリティ上の注意点が付随します。適切な予防措置を講じなければ、iFrameはクリックジャッキング、クロスサイトスクリプティング(XSS)、データ漏洩など、様々な攻撃のベクターとなる可能性があります。ウェブアプリケーションがより複雑で相互接続されるようになるにつれて、iFrameのセキュリティベストプラクティスを理解し、実装することはもはやオプションではなく、必須となっています。

iFrameの核となる課題は、本質的に外部コンテンツを自社のページのコンテキスト内で実行させるという事実にあります。この外部コンテンツは、自社のアプリケーションと同じセキュリティ基準に準拠していない可能性があり、あるいは悪意のあるものである可能性さえあります。したがって、iFrameセキュリティの目標は、この埋め込みコンテンツを可能な限り隔離し、親ドキュメントやユーザーデータと相互作用したり侵害したりする可能性を制限することです。

必須のiFrameセキュリティ対策:サンドボックス化とCSP

1. sandbox属性:最初の防衛線

HTML5のsandbox属性は、iFrameにとって最も重要なセキュリティ機能であると言えるでしょう。これにより、iFrame内のコンテンツに厳格な制限を適用し、ページの他の部分から隔離することができます。デフォルトでは、値なしでsandbox属性を含めるだけで、最も厳格な制限が適用され、iFrameコンテンツはまるで独自のオリジンから来たかのように扱われ、スクリプトの実行、フォームの送信、ローカルストレージへのアクセスが防止されます。

非常に安全ではありますが、デフォルトのサンドボックスは多くのユースケースにとって厳しすぎる場合があります。sandbox属性に特定のキーワードを値として指定することで、制限を選択的に解除できます。

  • allow-forms: フォームの送信を許可します。
  • allow-modals: iFrameがモーダルウィンドウ(alert(), confirm(), prompt()など)を開くことを許可します。
  • allow-popups: ポップアップ(例:window.open())を許可します。
  • allow-popups-to-escape-sandbox: サンドボックス化されたドキュメントが、サンドボックスの制限を継承せずに新しいウィンドウを開くことを許可します。
  • allow-pointer-lock: ポインターロックAPIを許可します。
  • allow-same-origin: iFrameコンテンツが親ドキュメントと同じオリジンから来たかのように扱われることを許可します。これは、埋め込みコンテンツが正しく機能するために必要な場合(例:クッキー、ローカルストレージへのアクセス)があります。極めて慎重に使用してください。
  • allow-scripts: JavaScriptの実行を許可します。これは強力な権限であり、信頼できるソースにのみ付与すべきです。
  • allow-top-navigation: iFrameがトップレベルのブラウジングコンテキスト(つまり、親ウィンドウのURL)をナビゲートすることを許可します。

ベストプラクティス:常にsandbox属性を使用してください。デフォルト(値なし)から始めて、必要最小限の権限のみを追加してください。例えば、決済フォームを埋め込む場合、allow-forms allow-scriptsが必要かもしれませんが、allow-same-originは、絶対に必要で徹底的に検証されている場合を除き、決して望ましくありません。

<iframe src="https://trusted-payment-gateway.com/form" sandbox="allow-forms allow-scripts"></iframe>

2. コンテンツセキュリティポリシー(CSP):コンテンツの読み込みを制御する

コンテンツセキュリティポリシー(CSP)は、XSSやデータインジェクションを含む様々な種類の攻撃を軽減するのに役立つ強力なセキュリティメカニズムです。HTTPヘッダー(Content-Security-Policy)または<meta>タグを介してCSPを定義することで、ブラウザがロードおよび実行を許可するコンテンツソースを指定できます。

iFrameセキュリティにとって、CSPは主に2つの点で重要です。

  • 親をiFrameから保護する:親ページ上の強力なCSPは、悪用されたiFrameがメインアプリケーションに悪意のあるスクリプトやコンテンツをロードするのを防ぐことができます。
  • iFrameを親から保護する(およびその逆):frame-srcディレクティブは、iFrameの有効なソースを具体的に制御します。frame-ancestorsディレクティブは、どのオリジンが現在のリソース(あなたのページ)をiFrameに埋め込むことを許可するかを規定し、クリックジャッキングを防ぎます。

CSPヘッダーの例:

Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted-cdn.com; frame-src 'self' https://trusted-iframe-source.com; frame-ancestors 'self';

このCSPは、スクリプトを自身のオリジンとtrusted-cdn.comからのみ許可し、iFrameを自身のオリジンとtrusted-iframe-source.comからのみ許可します。決定的なことに、frame-ancestors 'self'は、あなたのページが自身によってのみ埋め込まれることを保証し、クリックジャッキングを効果的に防ぎます。

クリックジャッキングからの保護:X-Frame-Optionsとframe-ancestors

クリックジャッキング(UIリドレッシング)は、悪意のあるウェブサイトが自社のサイトの上に、あなたのサイトの透明なiFrameを重ね、ユーザーが悪意のあるサイトとやり取りしていると思い込ませながら、あなたのサイトの要素をクリックさせる攻撃です。これにより、購入、設定変更、機密情報の漏洩などの不正な行為につながる可能性があります。

1. X-Frame-Options HTTPヘッダー

X-Frame-Options HTTPヘッダーは、クリックジャッキングを防ぐ伝統的な方法です。これは、ページが<frame><iframe><embed>、または<object>内でレンダリングできるかどうかをブラウザに伝えます。

  • X-Frame-Options: DENY: ページは、試行しているサイトに関係なく、フレーム内に表示できません。これは最も安全なオプションです。
  • X-Frame-Options: SAMEORIGIN: ページは、ページ自体と同じオリジンのフレーム内でのみ表示できます。

ベストプラクティス:あなたのページが他のサイトに埋め込まれることを明示的に必要としない限り(そしてその場合はframe-ancestorsを慎重に使用してください)、機密性の高いユーザーアクションを処理するすべてのページに対してX-Frame-Options: DENYを設定してください。

2. CSPのframe-ancestorsディレクティブ

コンテンツセキュリティポリシー内のframe-ancestorsディレクティブは、X-Frame-Optionsよりもモダンで柔軟な代替手段です。これにより、コンテンツを埋め込むことが許可されている複数のオリジンを指定できます。

例:

Content-Security-Policy: frame-ancestors 'self' https://partner-site.com;

これにより、あなたのページは自身とpartner-site.comによって埋め込まれることが許可されます。X-Frame-Optionsframe-ancestorsの両方が存在する場合、モダンブラウザでは一般的にframe-ancestorsが優先されます。より広範なブラウザ互換性のために両方を使用することが良い習慣です。

責任あるデータ処理と通信

iFrameが親ウィンドウと通信する必要がある場合(またはその逆)、直接的なJavaScriptアクセスは通常、同一オリジンポリシーによってブロックされます。クロスオリジン通信の推奨される安全な方法はwindow.postMessage()です。

window.postMessage()を安全に使用する

window.postMessage()は、異なるオリジン間でウィンドウが安全に通信することを可能にします。ただし、脆弱性を避けるためには、正しく使用することが重要です。

  • 常に送信元のオリジンを確認する:メッセージを受信する際は、常にevent.originプロパティをチェックして、メッセージが予期されるソースから来たものであることを確認してください。
  • ターゲットオリジンを指定する:メッセージを送信する際は、'*'の代わりに正確なターゲットオリジン(例:iframeWindow.postMessage('hello', 'https://expected-origin.com');)を指定してください。'*'を使用すると、任意のウィンドウがメッセージを受信する可能性があり、セキュリティリスクとなります。
  • 受信データをサニタイズする:postMessage()を介して受信したデータは、信頼できない入力として扱い、XSSを防ぐために使用する前にサニタイズしてください。

例(親からiFrameへ送信):

const iframe = document.getElementById('myIframe');
iframe.contentWindow.postMessage('Hello from parent!', 'https://trusted-iframe-source.com');

例(iFrameから親へ受信):

window.addEventListener('message', (event) => {
  if (event.origin !== 'https://parent-domain.com') {
    // 予期しないオリジンからのメッセージは無視またはログに記録する。
    return;
  }
  console.log('Message from parent:', event.data);
  // データを処理するが、まずサニタイズすること!
});

Diditが安全な埋め込みワークフローをどのように支援するか

Diditは、オールインワンの本人確認プラットフォームとして、本人確認フローのために埋め込み可能なコンポーネントを頻繁に利用しています。当社のNIST準拠のアプローチは、堅牢なiFrameとワークフローの隔離という重要なニーズを理解し、セキュリティを核として構築されています。Diditは、最高水準のセキュリティを遵守しながらシームレスに統合できるように設計された、安全なホスト型本人確認リンクとWeb SDKを提供します。

  • ホスト型本人確認リンク:Diditは、各本人確認セッションに対して安全でユニークなURLを生成します。これらのリンクは、ユーザーをDiditがホストする隔離された環境にリダイレクトし、機密性の高い本人確認プロセスをアプリケーションのドメインから完全に分離します。これにより、主要な本人確認のために、お客様側で複雑なiFrameのサンドボックス化を行う必要がなくなります。
  • 強力な隔離機能を備えたWeb SDK:インコンテキストでの埋め込みが必要なシナリオでは、DiditのWeb SDKは、最も厳格なsandbox属性を活用して、安全なiFrame内で動作するように設計されています。当社は、postMessage()を使用した安全なクロスオリジン通信の複雑さを管理し、iFrameとアプリケーション間で必要な、サニタイズされたデータのみが交換されるようにします。
  • コンプライアンスと認証:DiditはSOC 2 Type IIおよびISO 27001の認証を取得しており、GDPRに準拠しています。当社のインフラとプロセスは、機密性の高い本人確認データを安全に処理するように構築されており、お客様のコンプライアンス負担とリスクを軽減します。
  • 最小限のデータ露出:Diditのアーキテクチャはプライバシーバイデザインです。生体認証の場合、セルフィーはメモリ内で処理され、削除され、お客様のアプリケーションはブール値(例:「認証済み」)を受け取り、生の生体認証データは受け取りません。これにより、埋め込み可能なコンポーネント内で処理される機密情報が最小限に抑えられます。

Diditの事前構築された安全な埋め込み可能ソリューションを使用することで、企業はiFrameセキュリティの専門家にならずとも高度な本人確認を統合でき、ユーザーの信頼とデータ保護を確保しながら、主要な製品に集中することができます。

今すぐ始めましょう!

iFrameを保護することは、回復力があり信頼できるウェブアプリケーションを構築するための重要なステップです。サンドボックス化、CSP、X-Frame-Options、安全なpostMessage()の慣行を diligently適用することで、ユーザーやアプリケーションを不必要なリスクにさらすことなく、埋め込みコンテンツの力を活用できます。Diditの安全な本人確認ソリューションを探索して、ワークフローに堅牢なセキュリティを統合するのがいかに簡単であるかを確認してください。

Diditの料金を見る | Diditのドキュメントを見る | デモを試す

本人確認と不正対策のインフラ。

KYC、KYB、取引監視、ウォレットスクリーニングを一つのAPIで。5分で統合できます。

AIにこのページの要約を依頼する
iFrameセキュリティ:ウェブ開発者のためのベストプラクティス.