2. X-Frame-Options Header (X-Frame-Options ヘッダー)
2. X-Frame-Options Header (X-Frame-Options ヘッダー)
X-Frame-Options HTTP ヘッダーフィールドは, ブラウザが送信されたリソースを <frame> または <iframe> 内にレンダリングすべきかどうかを指定するポリシーを示します。サーバーは, クリックジャッキング (clickjacking) 攻撃を防ぐために, HTTP 応答のヘッダーでこのポリシーを宣言でき, これによりコンテンツが他のサイトに埋め込まれないことを保証します。
2.1 Syntax (構文)
ヘッダーフィールド名は次のとおりです:
X-Frame-Options
このヘッダーフィールドには3つの異なる値があります。これらは相互に排他的です; つまり, ヘッダーフィールドはこれら3つの値のうちの1つに設定されなければなりません。
DENY
このヘッダーフィールドを持つコンテンツを受信したブラウザは, このコンテンツをいかなるフレームにも表示してはなりません。
SAMEORIGIN
このヘッダーフィールドを持つコンテンツを受信したブラウザは, コンテンツ自体とは異なるオリジン (origin) のページのフレームにこのコンテンツを表示してはなりません。ブラウザまたはプラグインがコンテンツとフレームのオリジンが同じかどうかを確実に判断できない場合, これは "DENY" として扱われなければなりません。
現在の実装では, この基準の解釈が異なることに注意してください。一部の実装では, トップレベルのブラウジングコンテキスト (top-level browsing context) のオリジンが X-Frame-Options ディレクティブを使用するコンテンツのオリジンと一致することのみが要求されます; 他の実装では, この基準がすべての祖先ブラウジングコンテキストで満たされる必要があります。フレームのネストと, 異なるブラウザにおけるこのヘッダーフィールドの動作の違いに関する詳細については, セクション 2.3.2.2 を参照してください。さらに, これから生じる可能性のあるセキュリティ上の問題については, セクション 4 の第 2 段落を参照してください。
ALLOW-FROM (シリアル化されたオリジン (serialized-origin) [RFC6454] が続く)
このヘッダーフィールドを持つコンテンツを受信したブラウザは, トップレベルのブラウジングコンテキストのオリジンが指定されたオリジンと異なるページのフレームにこのコンテンツを表示してはなりません。このヘッダー値はサポートが限定的である可能性があり, 最新のブラウザでは非推奨となっています。
X-Frame-Options ヘッダーフィールドは HTTP ヘッダーフィールドとして送信されなければならず, ブラウザは <meta http-equiv> タグ内で見つかったインスタンスを明示的に無視することに注意してください。
2.2 Augmented Backus-Naur Form (ABNF) (拡張バッカス・ナウア記法)
RFC 5234 ABNF [RFC5234] における X-Frame-Options ヘッダーフィールド値の定義は次のとおりです:
id-name = "X-Frame-Options"
X-Frame-Options = "DENY"
/ "SAMEORIGIN"
/ ( "ALLOW-FROM" RWS serialized-origin )
RWS = 1*( SP / HTAB )
; required whitespace
serialized-origin = scheme "://" host [ ":" port ]
; <scheme>, <host>, <port> as per RFC 6454
ここで "serialized-origin" は, RFC 6454 [RFC6454] のセクション 6.2 で定義されています。生成規則 "serialized-origin" は, シリアル化されたオリジン文字列に空白文字を含めることができないことを意味します。
2.2.1 Examples of X-Frame-Options (X-Frame-Options の例)
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM https://example.com/
2.3 Design Issues (設計上の問題)
2.3.1 Enable HTML Content from Other Domains (他のドメインからの HTML コンテンツの有効化)
他のドメインからの HTML コンテンツを有効にする主な直接的なベクトルは多数あります。例えば:
<frame>要素<iframe>要素<object>要素<applet>要素<embed>要素
これらに加えて, 他の要素が親フレームでアクションを実行するために利用される可能性があり, クリックジャッキングのような攻撃に寄与する可能性があります。これには <script> タグ, <form> タグ, <button> タグなどが含まれます。X-Frame-Options ヘッダーフィールドは, サイト運営者が自分のページを他のドメインからのフレームに埋め込むべきでないことを示すメカニズムを提供し, それによってクリックジャッキング攻撃から防御します。
2.3.2 Browser Behavior and Processing (ブラウザの動作と処理)
2.3.2.1 Violation of X-Frame-Options (X-Frame-Options の違反)
ブラウザがページをフレーム内にレンダリングすることを防ぐ X-Frame-Options ヘッダーを検出した場合, ブラウザは直ちに文書のレンダリングを停止しなければなりません。
ページは, ユーザーが文書をロードするリクエストをキャンセルしたかのように扱われなければなりません。これは, ユーザーエージェントが "204 No Content" 応答を処理する方法と似ていますが, 後者はエラー状態をもたらしません。
ブラウザがすでにページに含まれる画像や他のリソースリクエストのダウンロードを開始している場合, ブラウザはできるだけ早くこれらのリソースのダウンロードを停止しようと試みるべきです。
2.3.2.2 Variation in Current Browser Behavior (現在のブラウザ動作の違い)
ブラウザは, SAMEORIGIN ヘッダーフィールドが使用される場合に必要なフレームとブラウジングコンテキストのチェックの解釈が異なります。意図された動作は, ユーザーエージェントがそのフレームがフレーム化されているページと同じオリジンにある場合にのみ, フレーム内にページをレンダリングしなければならないということです。
しかし, ブラウザの実装は異なります。一部の実装は, ブラウジングコンテキストの祖先ツリー全体をウォークし, 各祖先が同じオリジンにあることを要求します。他の実装は, トップレベルのブラウジングコンテキスト (ウィンドウ) が同じオリジンからのものであることのみを確認します。
これは, 複数の中間ページを介して "フレーム化" されたページ (つまり, フレーム内のフレーム内のフレーム) の場合, 正常にレンダリングされるページのセットが, 仕様が意図するものよりも制限的 (祖先チェーン全体をチェックする実装の場合) または寛容 (トップレベルのフレームのみをチェックする実装の場合) になる可能性があることを意味します。
サイト運営者は, この動作の潜在的な違いに注意し, 期待されるブラウザベース内でレンダリングをテストして, クリックジャッキング対策ポリシーへの準拠を確保する必要があります。
2.3.2.3 Usage Design Pattern and Example Scenario for the ALLOW-FROM Parameter (ALLOW-FROM パラメータの使用設計パターンと例のシナリオ)
異なるブラウザ間でのサポートが弱く, 実装が異なるため, ALLOW-FROM オプションは非推奨となっています。サイト運営者は, 代わりに Content Security Policy の frame-ancestors ディレクティブ [CSP2] の使用を検討すべきです。これはフレーム埋め込みポリシーに対するより優れた制御を提供し, ブラウザサポートもより優れています。
2.3.2.4 No Caching of the X-Frame-Options Header (X-Frame-Options ヘッダーのキャッシュなし)
ブラウザは, その HTTP 応答に存在するキャッシュディレクティブや以前にキャッシュされた応答に関係なく, 各 HTTP 応答に対して X-Frame-Options ヘッダーフィールド値を処理しなければなりません。ヘッダーフィールドはナビゲーション時に評価され, キャッシュされてはなりません。これにより, 最新のポリシーが適用されることが保証されます。