iframe 埋め込みチェッカー
無料オンラインiframeチェッカー:任意のWebページURLを入力して、X-Frame-OptionsおよびContent-Security-Policy(frame-ancestors)ヘッダーを検出。iframe内での埋め込み可否を確認し、ライブプレビューで検証できます。履歴は現在のブラウザセッション中にのみ保持されます。
履歴(現在のセッション内)
このタブ内のみ(sessionStorage)に保存されます。タブを閉じるとデータは消去されます。サーバーへの送信は一切ありません。
チェックの仕組み
- ターゲットURLを入力して「チェック」をクリックします。サーバーは実際のiframeリクエストとしてページを取得し(Sec-Fetch-Dest: iframe付与)、そのレスポンスヘッダーを読み取ります。
- 判定はX-Frame-Options(DENY / SAMEORIGINでフレーム表示をブロック)とContent-Security-Policy frame-ancestors(* またはスキームワイルドカードのみが任意の第三者親元を許可)に基づいて行われます。
- ライブプレビュー用iframeに同一URLを読み込み、ブラウザが実際にどう動作するか(ヘッダーからは読み取れないJavaScriptのフレーム崩し対策含む)を確認できます。
ページの埋め込み可否を決定する要素は?
あるWebページが他サイトの <iframe> 内で表示可能か否かは、そのページが返すレスポンスヘッダーを基にブラウザーが判断します。本ツールは同様の検証をサーバーサイドで行い、即時に判定結果をお届けします。
X-Frame-Options は従来のヘッダーです。DENY は全ページでのiframe埋め込みを禁止し、SAMEORIGIN は同一オリジンのページからのみ埋め込みを許可します。ALLOW-FROM は現行ブラウザで廃止されています。このヘッダーが存在しない場合、従来ルールの影響を受けず埋め込みが許可されます。
Content-Security-Policy frame-ancestors は現行標準の代替ヘッダーです。ページを埋め込むことを許可するオリジンを指定します(例:frame-ancestors 'self' https://example.com)。値を *(または https: のようなプロトコルのみ)に設定すると、HTTPS 経由の親サイトすべてが許可されます。これより制限を設ければサードパーティの埋め込みをブロックできます。
ヘッダーの設定だけでは全てが解決しない点にご注意ください。ページ内のスクリプトによってトップレベルへの移動強制などのフレーム解除処理が行われる場合がありますし、ログインページや地域制限のあるエンドポイントでは、データセンターからのリクエスト時に挙動が異なることもあります。そのため、すべての判定結果には実際にページを表示するライブプレビューを併記しています。
クイックガイド:レスポンスヘッダーの設定
サイトを所有している場合は、レスポンスヘッダーで直接フレーム制御を行うことができます。
任意のページからの埋め込みをブロックする
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
ブラウザーはいかなるiframe内でもページを表示しないよう拒否します。これが最も厳格なクリックジャッキング対策です。
同一オリジンからの埋め込みのみ許可する
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
スキーム・ホスト・ポートがすべて一致するページからのみ埋め込み可能です。外部サイトの埋め込みはブロックされます。
特定のオリジンからの埋め込みのみ許可する
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
frame-ancestors ディレクティブに許可するオリジンを指定してください。記載外のオリジンは自動的にブロックされます。
任意のページからの埋め込みを許可する
X-Frame-Options は設定しないでください
Content-Security-Policy: frame-ancestors *
外部サイトを問わず、すべてのサイトがこのページをiframeに埋め込むことができます。セキュリティ上のリスクと利便性のバランスをよく検討してください。
備考:X-Frame-Options は CSP の frame-ancestors で置き換えるのが推奨されます。両方設定された場合は CSP が優先適用されます。基本的には frame-ancestors の使用をお勧めします。
サーバーはiframeからのリクエストをどう検知するか
2020年頃から、ChromiumやFirefox系のブラウザはナビゲーションおよびサブリソースの各リクエストに対し、Fetch Metadata Request Headers の一覧を自動的に付与するようになりました。埋め込み判定に特に有用なのが Sec-Fetch-Dest です。このヘッダーは要求元ページの特別な連携なしに、リソースを要求したコンテキストの種類をサーバーに通知します。
- Sec-Fetch-Dest: document — トップレベルのナビゲーションであり、iframeなどのフレーム内ではありません。
- Sec-Fetch-Dest: iframe — リクエストは <iframe> 要素内で読み込まれています。
- Sec-Fetch-Dest: frame — 従来の <frame>(frameset)タグ内で読み込まれています。
- Sec-Fetch-Dest: embed / object — <embed> または <object> 要素内で読み込まれています。
このチェックツールは `Sec-Fetch-Dest: iframe` を指定して独自プローブを送信します。これはページを埋め込む際に実際のブラウザが送出するリクエストと完全に同一であるため、判定結果は単なる一般的な `fetch` 通信ではなく、本物の iframe リクエストに対してターゲットサーバーが実際どう反応するかを正確に反映しています。
`Sec-Fetch-Dest` は有用な指標ですが、セキュリティ上の決定的な境界線ではありません。このヘッダーは現代的なブラウザでのみ送信され、curlやボット、一部のWebView、レガシーブラウザなどの非ブラウザクライアントは、このヘッダーを完全に省略したり任意の値を送信したりすることが可能です。サーバーではこれを元にログ収集やレート制限を設けることはできますが、フレーム埋め込みの可否をこれ一つだけで判断してはいけません。最終的な判断は依然として `X-Frame-Options` や `CSP frame-ancestors` に委ねられており、これらはブラウザ側がリクエストヘッダーの内容に関わらず独立して強制適用するためです。
クライアント側でも、HTTPヘッダーに依存せずにページ自身がフレーム内で表示されていることを検知し、対処することができます。具体的には `window.top !== window.self` の比較(あるいは同オリジン時の `window.frameElement` 参照)によって検知し、アラートを表示したり強制的に最上位ウィンドウへリダイレクトさせたりするのが一般的です。これが前述した「フレームバスタリング」の手法であり、リクエストヘッダーの値に関わらず確実に機能します。
サーバー設定例:IFrame埋め込みのブロック
以下に示すコードスニペットは、各サーバーまたはフレームワークでiframe埋め込みを完全ブロック(X-Frame-Options: DENY + CSP frame-ancestors 'none')する設定方法を紹介しています。これは前述のクイックガイドにおける最も厳格な対策パターンです。
server {
location / {
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;
}
}
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
next();
});
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
],
},
];
},
};
class SetFrameOptions
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");
return $response;
}
}
export default {
async fetch(request) {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('Content-Security-Policy', "frame-ancestors 'none'");
return new Response(response.body, { status: response.status, headers });
},
};
全ブロックではなく、自サイトや限られた許認可リストのみを対象に埋め込みを許可したい場合は、DENY を SAMEORIGIN に、『none』を 'self' または許可するオリジンのリストに置き換えてください。その他の設定手順は同一のままです。
主なプラットフォームの注意点
ヘッダーの基本ルールとは別に、主要プラットフォームには独自の仕様や挙動が存在します。「ブロック対象」か「埋め込み可能」かをヘッダー情報だけで断定する前に、これらの特徴を知っておくと安心です。
| プラットフォーム / シナリオ | 判定結果 | 理由 |
|---|---|---|
| YouTube 視聴ページ (youtube.com/watch) | ブロック対象 | 通常ページではなく、公式のプレイヤー用URL `youtube.com/embed/{id}` を使用してください。通常の視聴ページには制限的なフレーム埋め込みポリシーが付与されています。 |
| Google Maps 店舗・施設ページ | ブロック対象 | 埋め込みに対応しているのは、Maps Embed API専用のiframe URL (`google.com/maps/embed`) のみです。 |
| Google / Microsoft OAuth ログインページ | ブロック対象 | 2015年より前から、iframe内での資格情報詐取(フィッシング)被害を防ぐ目的で明示的にブロックされています。ログイン処理は必ず最上位ウィンドウまたはポップアップ上で実行してください。 |
| 決済購入ページ(Stripe Checkout、PayPal、各種銀行ゲートウェイなど) | ブロック対象 | 決済フォームのiframe埋め込みは古典的なクリックジャッキング攻撃の手口であるため、決済事業者側で厳格にブロックされます。 |
| GitHub リポジトリ / ファイルページ | ブロック対象 | サイト全体で `frame-ancestors 'none'` が設定されています。埋め込み利用には代替手段として REST/GraphQL API、またはスクリーンショットの利用をご検討ください。 |
| Notion / Google Docs 「ウェブ公開」ページ | 埋め込み可能 | 埋め込み利用を前提として設計されており、サービス側で標準的な埋め込みコードが提供されています。 |
| Wikipedia 記事 | 埋め込み可能 | デフォルトでは `X-Frame-Options` や `CSP` による制限は設定されていませんが、大規模に埋め込む際は著作権表記(Attribution)やライセンス条項を事前に確認することをお勧めします。 |
主な利用事例
- 連携コードの開発に入る前に、外部ウィジェット、ダッシュボード、または文書を自プロダクトに安全に埋め込み可能かを確認できます。
- 自サイトが意図通り `X-Frame-Options` もしくは `CSP frame-ancestors` のポリシーを正しく返却しているかを検証できます。
- クリックジャッキング防止策のデバッグ:iframe内に表示される `about:blank` や拒否メッセージが表示される理由を確認します。
- コンテンツ収集やポータル統合時に候補URLを一括チェックし、セッション履歴を活用して過去の結果へ再アクセスできます。
- サードパーティ製サービスのiframe設置(フレーミング)ポリシーを記録・整理し、セキュリティレビューやペンテストに備えます。