iframeの埋め込み先のページ表示をブロックする
iframeの埋め込み先のページ表示をブロックする方法を紹介します。
概要
他のサイトのiframeの中のコンテンツとして自サイトのコンテンツを表示される動作をブロックしたい場合があります。
HTTPレスポンスヘッダに
X-Frame-Options
を返却すると、他のドメインのiframeからの表示をブロックできます。
書式
HTTPレスポンスヘッダに次の値を出力します。
または
X-Frame-Options : SAMEORIGIN
X-Frame-Optionsで設定できる値は以下があります。
設定値 | 意味 |
DENY | すべてのウェブページでフレーム内の表示を禁止する |
SAMEORIGIN | 同一オリジン(呼び出し元が同じドメインかつ、同じプロトコル)のWebサイトのみフレーム内の表示を許可する |
ALLOW-FROM | 指定したURIのフレーム内の表示を許可する (この値は現在は廃止されています。) |
同一オリジンの判定
同一オリジンは呼び出し元が同じドメインかつ、同じプロトコルのURLになります。
呼び出し元が
http://www.ipentec.com/contents/index.html
の場合
URL | 同一オリジンか | 説明 |
http://www.ipentec.com/publish/content.html | 〇 | 同一オリジン |
http://www.ipentec.com/publish/test/document.html | 〇 | 同一オリジン |
https://www.ipentec.com/publish/content.html | × | プロトコルが違うので同一オリジンでない |
http://www.ipentec.com:8080/doc/content.html | × | ポートが違う場合も同一オリジンでない |
https://ipentec.jp/publish/content.html | × | ドメイン(ホスト)が違うので、同一オリジンでない |
実装
コード
下記のHTMLファイルを用意します。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body style="background-color:#a2ceee;">
<div style="background-color:#FFFFFF; margin-top:3em;border:1px solid #1a297d;">ABCDE</div>
<div style="background-color: #FFFFFF; margin-top: 3em;border: 1px solid #1a297d;">FGHIJ</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<iframe style="width:740px;height:240px;" src="https://ipentec.jp/test-document-folder/content.html"></iframe>
</body>
</html>
解説
frame.html のiframeタグで content.html を読み込んで表示しています。
content.htmlはframe.htmlを配置したドメインとは異なる
https://ipentec.jp/test-document-folder/content.html
に配置しています。
表示結果
frame.html をWebブラウザで表示します。下図のページが表示されます。iframe内にページが表示されています。
HTTPレスポンスヘッダへの追加
HTTPレスポンスヘッダに
X-Frame-Options
ヘッダを追加します。Webサーバーで設定する方法とWebアプリケーションで設定する方法があります。
それぞれの手順は下記を参照してください。
X-Frame-Options 設定後の表示結果
X-Frame-Options 設定後に frame.html をWebブラウザで表示します。表示がブロックされ iframe内にページが表示されない状態になります。
マウスポインタをiframe内に移動すると、埋め込み先のサーバーで接続が拒否された旨のメッセージが表示されます。
iframeでの表示を拒否する設定ができました。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。