結論(CSP frame-ancestorsを全HTMLへ適用)
CSP frame-ancestorsを全HTMLへ適用とは、ページを埋め込んでよい祖先のオリジンを指定する指示を、すべてのHTML応答に付けることです。Content-Security-Policyレスポンスヘッダーのframe-ancestorsディレクティブでiframe等の埋め込み元を指定し、下層ページやエラーページにも付けます。OWASP ASVS 5.0.0 V3.4.6はX-Frame-Optionsを旧式としてframe-ancestorsの使用を求めています。埋め込みが不要なら frame-ancestors 'self' または 'none' を共通設定で付与します。
この記事のポイント
- frame-ancestorsはX-Frame-Optionsの後継で、'self'に加えて許可する埋め込み元を複数指定できます。
- frame-ancestorsはdefault-srcの代替にならず、metaタグのCSPやContent-Security-Policy-Report-Onlyでは埋め込みを阻止できません。
- セキュリティAIチェッカーは、X-Frame-Optionsだけの応答を不合格とし、全HTML応答のCSPヘッダーにframe-ancestorsがあるかを確認します。
- frame-ancestors *、https:、'self' * のように任意のサイトを許すトークンを含む値は、制限なしとして扱います。
- 新規導入はframe-ancestorsだけのポリシーから始めれば、スクリプト等の読み込みに影響しません。
| 診断項目名 | CSP frame-ancestorsを全HTMLへ適用 |
|---|---|
| 項目ID | crawl.csp-frame-ancestors-coverage |
| 分類 | セキュリティヘッダー |
| 重大度・配点の重み | 重要(high) 重み 4 |
| 関連する標準・ガイドライン | OWASP ASVS 5.0.0 V3.4.6(すべてのHTTP応答で CSP の frame-ancestors を使い、既定で埋め込めないようにし、必要な場合だけ特定の埋め込みを許可する。X-Frame-Options は旧式で頼るべきではない、L2)、W3C Content Security Policy Level 3(frame-ancestors ディレクティブ)、OWASP WSTG-CLNT-09(Clickjacking)、WSTG-CONF-12(Content Security Policy)、CWE-1021(Improper Restriction of Rendered UI Layers or Frames) |
CSP frame-ancestorsを全HTMLへ適用とは
CSP frame-ancestorsを全HTMLへ適用とは、Content Security Policy(CSP)の frame-ancestors ディレクティブを、レスポンスヘッダーで、トップページだけでなく下層ページやエラーページを含むすべてのHTML応答に付けることです。
frame-ancestors は、そのページを iframe・frame・object・embed などで埋め込んでよい「祖先」のオリジンを指定するディレクティブです。X-Frame-Options の後継にあたる仕組みで、許可先を複数指定できます。
OWASP ASVS 5.0.0 V3.4.6 は、X-Frame-Options はブラウザが対応していても旧式であり頼るべきではないとして、frame-ancestors の使用を求めています。セキュリティAIチェッカーのこの項目は、トップページと巡回した下層ページの全HTML応答に、強制モードのCSPヘッダーで、実質的な制限となる frame-ancestors があるかを確認します。X-Frame-Options だけの応答は、別項目「クリックジャッキング対策を全HTMLへ適用」では合格でも、本項目では不合格になります。クリックジャッキングという攻撃そのものの解説は同項目に譲り、このページは frame-ancestors の書き方と全HTMLへの適用に絞って解説します。
frame-ancestors の書き方
| 値 | 意味 |
|---|---|
frame-ancestors 'none' | どこからも埋め込み不可(X-Frame-Options: DENY 相当) |
frame-ancestors 'self' | 同一オリジンからのみ可(SAMEORIGIN 相当) |
frame-ancestors 'self' https://www.pref.example.lg.jp | 自サイトと指定オリジンから可 |
frame-ancestors * | どこからでも可(制限なし) |
X-Frame-Options の SAMEORIGIN は、ブラウザによって「直上の親だけ」か「すべての祖先」かの解釈に差がありましたが、frame-ancestors は祖先すべてを検査すると定義されています。
frame-ancestorsの仕様上の重要な性質(CSP3)
- frame-ancestors は
default-srcの代替にはなりません。default-src 'self'だけでは埋め込みは制限されません。明示が必要です。 <meta http-equiv="Content-Security-Policy">の中の frame-ancestors は無視されます。HTTPレスポンスヘッダーで送る必要があります。Content-Security-Policy-Report-Onlyは違反を報告するだけで、埋め込みを阻止しません。- 1つの応答に複数のCSPヘッダーがある場合、すべてのポリシーが適用され、最も厳しい制限が効きます。HTTPの仕様上、複数ヘッダーはカンマで連結された1つの値と同等です。
- HTML 仕様では、強制モードのCSPに frame-ancestors があると X-Frame-Options は無視されます。
なぜ X-Frame-Options だけでは足りないとされるのか
- 許可先を個別に指定できず(
ALLOW-FROMは現行ブラウザで無効)、正当な埋め込みが必要なサイトでは保護を外す運用になりがちです。 - 仕様上の位置付けが「旧来の互換機能」であり、新しい保護機能は CSP 側で定義されています。
ただし、X-Frame-Options に現在の主要ブラウザで保護効果がないわけではありません。古いブラウザ対策として、frame-ancestors と併記することは有効です。
CSP frame-ancestorsを全HTMLへ適用の診断基準(セキュリティAIチェッカー)
取得対象
- トップページ(最終応答)と、巡回で発見した同一オリジンの下層ページのうち最大2ページ(GET、リダイレクト最大2回、応答上限180KB、取得失敗ページは除外)。
Content-Typeがtext/html、または本文に<htmlを含む応答を評価対象とします。404などのHTMLエラー応答も対象です。
「frame-ancestors あり」とする条件
Content-Security-Policy レスポンスヘッダー(複数ある場合はカンマ連結された値)の中に、ディレクティブ区切り(先頭・;・, の直後)から始まる frame-ancestors があり、その値を空白で区切ったトークンに *・https:・http:(スキームだけの指定)を1つも含まず、空でもないこと。frame-ancestors が複数ある場合(複数ポリシーを含む)は、最初に現れたものの値だけで判定します。
次のものは「なし」として扱います。
Content-Security-Policy-Report-Onlyだけにある frame-ancestors<meta>要素の CSP にある frame-ancestorsframe-ancestors *、frame-ancestors https:、frame-ancestors 'self' *など、任意のサイトを許すトークンを含むもの(埋め込み制限にならない)- X-Frame-Options だけの応答
判定条件
| 判定 | 条件 | 得点係数 |
|---|---|---|
| ○ 問題なし(pass) | 評価したすべてのHTML応答に frame-ancestors あり | 1 |
| × 要改善(fail) | HTML応答のうち1つでも frame-ancestors なし | 0 |
| 対象外(na) | HTML応答が1つもない | 計算から除外 |
重み4で、× の場合は4点分を失います。根拠欄には不足ページ数と、X-Frame-Options だけでは ASVS 5.0.0 の要件を満たさない旨を表示します。
自治体サイトでの判定例
| 構成 | 判定 |
|---|---|
X-Frame-Options: SAMEORIGIN だけを全ページに設定 | ×(「クリックジャッキング対策を全HTMLへ適用」は ○) |
Content-Security-Policy: frame-ancestors 'self' を Webサーバー共通設定で付与 | ○ |
CMSの <meta> でCSPを出力している | ×(本項目では評価されない) |
動作確認のため Content-Security-Policy-Report-Only: frame-ancestors 'self' だけを設定 | ×(報告のみで阻止しないため) |
地図ページを県ポータルに埋め込ませるため、そのページだけ frame-ancestors 'self' https://www.pref.example.lg.jp | ○(許可先を限定しているため) |
frame-ancestorsがないとどんなリスクがあるか
- クリックジャッキング:frame-ancestors も X-Frame-Options もないページは、攻撃者のページに透明に重ねられ、ログイン中の利用者に意図しない操作をさせられます(詳細は「クリックジャッキング対策を全HTMLへ適用」を参照)。
- 移行時の保護の欠落:X-Frame-Options だけに頼っていると、埋め込みを許可する要望が出た際にヘッダーを外すしかなく、そのページが無防備になります。frame-ancestors なら許可先だけを開けられます。
- 設定の見落とし:
default-srcを設定しただけで埋め込み対策も済んだと誤解し、frame-ancestors が欠けたまま運用される例が見られます。
CSP frame-ancestorsを全HTMLへ適用する設定方法(Apache・nginx・IIS・Next.js)
段階的な導入
- 自サイトのページを iframe で埋め込んでいる他サイト・サービスを洗い出す(アクセスログの Referer、関係課への照会)。
- まず全HTML応答に
frame-ancestors 'self'を付与する。埋め込みが必要なページだけ、許可先オリジンを追記する。 - 既に CSP を運用しているなら、既存ポリシーに
; frame-ancestors 'self'を追加する。新規に CSP を導入する場合、frame-ancestors だけのポリシーから始めればスクリプト等の読み込みには影響しません。 - 古いブラウザ向けに X-Frame-Options: SAMEORIGIN も併記する(許可先を個別指定したページでは X-Frame-Options を付けない)。
Apache(.htaccess)
<IfModule mod_headers.c>
# CSP が未設定のサイト:frame-ancestors だけのポリシーを付与
Header always set Content-Security-Policy "frame-ancestors 'self'"
</IfModule>
# 埋め込みを許可するページだけ別設定にする例
<Files "map.html">
Header always set Content-Security-Policy "frame-ancestors 'self' https://www.pref.example.lg.jp"
Header always unset X-Frame-Options
</Files>
既存のCSPがある場合は、Header always set で上書きせず、既存値の末尾に ; frame-ancestors 'self' を加えます。別の Header always add Content-Security-Policy "frame-ancestors 'self'" として2本目のヘッダーを足す方法も、ブラウザは両方のポリシーを適用するため有効です。
nginx
add_header Content-Security-Policy "frame-ancestors 'self'" always;
add_header X-Frame-Options "SAMEORIGIN" always;
location 内に別の add_header があると上位の add_header は継承されません。共通ヘッダーを include ファイルにまとめるか、nginx 1.29.3 以降の add_header_inherit merge; を使います。
IIS(web.config)
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="frame-ancestors 'self'" />
</customHeaders>
</httpProtocol>
</system.webServer>
Next.js(Vercel)
// next.config.js
module.exports = {
async headers() {
return [{
source: "/:path*",
headers: [{ key: "Content-Security-Policy", value: "frame-ancestors 'self'" }],
}];
},
};
Proxy(proxy.ts。Next.js 15以前の Middleware)で nonce 付きの CSP を生成している場合は、その CSP 文字列に frame-ancestors 'self' を含めます。next.config.js と Proxy の両方でCSPを出すと2本のヘッダーになるため、出力箇所を一本化します。
frame-ancestorsの確認方法
curl -s -o /dev/null -D - https://www.example.lg.jp/ | grep -i '^content-security-policy'
curl -s -o /dev/null -D - https://www.example.lg.jp/no-such-page | grep -i '^content-security-policy'
content-security-policy-report-only ではなく content-security-policy に frame-ancestors があることを確認します。ブラウザの開発者ツールでは、埋め込みを拒否すると「Refused to frame ... because an ancestor violates the following Content Security Policy directive」のようなコンソールメッセージが出ます。
サイトを壊さないための注意点(ガードレール)
- 埋め込みを許可していたページに
'self'を付けると、他サイト上の表示が消えます。導入前の洗い出しが重要です。 - CSP をレスポンスヘッダーで新規に付与する際、
default-srcなどを同時に入れるとインラインスクリプトが止まり画面が崩れることがあります。本項目の対策としては frame-ancestors だけを含むポリシーで十分です。
よくある質問(FAQ)
frame-ancestorsとX-Frame-Optionsの違いは何ですか?
X-Frame-OptionsはDENY/SAMEORIGINしか指定できず、許可先の個別指定(ALLOW-FROM)は現行ブラウザで無効です。frame-ancestorsは許可先を複数指定でき、すべての祖先を検査すると定義されています。強制モードのCSPにframe-ancestorsがあると、X-Frame-Optionsは無視されます。
default-src 'self'を設定していれば埋め込みも制限されますか?
制限されません。frame-ancestorsはdefault-srcの代替にならないため、明示的に書く必要があります。
metaタグのCSPでframe-ancestorsを指定できますか?
できません。meta http-equivのCSPに書いたframe-ancestorsは無視されます。HTTPレスポンスヘッダーで送ってください。
Content-Security-Policy-Report-Onlyで設定しても合格になりますか?
なりません。Report-Onlyは違反を報告するだけで埋め込みを阻止しないため、この項目では「frame-ancestorsなし」として扱います。
X-Frame-Optionsはもう不要ですか?
現在の主要ブラウザで保護効果がないわけではなく、古いブラウザ対策としてframe-ancestorsと併記するのは有効です。ただし許可先を個別指定したページでは、X-Frame-Optionsを付けないようにします。
特定のサイトにだけ埋め込みを許可するにはどう書きますか?
そのページだけ frame-ancestors 'self' https://www.pref.example.lg.jp のように許可先オリジンを列挙します。許可先を限定していれば、この項目では合格です。
既存のCSPがある場合、どう追加すればよいですか?
既存のポリシーの末尾に ; frame-ancestors 'self' を追加します。上書きすると既存のCSPが失われます。Apacheでは「Header always add」で2本目のCSPヘッダーとして足す方法も、ブラウザが両方のポリシーを適用するため有効です。
この項目を含む127項目を、URLを入れるだけで無料診断します。
参考資料
- OWASP ASVS 5.0.0 V3 Web Frontend Security(V3.4.6)
- W3C Content Security Policy Level 3
- HTML Living Standard(X-Frame-Options の処理)
- MDN CSP: frame-ancestors
- OWASP Clickjacking Defense Cheat Sheet
- OWASP HTTP Headers Cheat Sheet
- Apache HTTP Server mod_headers
- nginx ngx_http_headers_module
- Next.js headers
- Next.js proxy.js(旧 Middleware)