かばだんなさん かく語りぬ Header Image

Firefox もX-FRAME-OPTIONSに対応したらしい

リリースノートを見て知ったのですが、Firefox 3.6.9 になってとうとう Firefoxも X-FRAME-OPTIONS に対応したそうですね。

この機能、元々はIE8で搭載された機能なのですが、あなたのサイトのページが、誰かのサイトのフレーム(<FRAMESET>)分割されたページの1フレーム(<FRAME>)として使われるのを規制する機能です。
・・・言葉だけだと分かりづらいですね。こんなイメージです。
X-FRAME-OPTIONSに適応してないページ

こういうページでは、あなたのサイトと思わせておいてクリックジャッキング攻撃に使われてしまう可能性があります。そりゃ困る!

ということで、X-FRAME-OPTIONS の出番です。あなたのページのHTTP(レスポンス)ヘッダにこの指定をしておけば、例えば私がこの知らない誰かのページを表示しても、ブラウザの方で「あ、このページはフレームセットの一部として表示しちゃいけないんだな!」と判断して、表示しないでくれるのです。

X-FRAME-OPTIONSの規制には2種類あります。

X-FRAME-OPTIONS : deny

このページはフレームセットの一部として表示されません。もしあなたのサイトがフレームを使っているなら、そちらも表示されなくなってしまいます。それは困りますね。

X-FRAME-OPTIONS : sameorigin

親ページ(フレームセット)が同じドメインの場合のみ表示してくれます。(厳密にはサブドメイン違いはOKです。)
これならあなたのサイトがフレームを使っていても表示されます。


で、具体的な設定方法ですが、割と簡単です。

~ .htaccessに書く場合 ~

きちんと書いて下さってる方がいらしたので蛇足は省きます。

~ プログラムで書く場合 ~

PHPでしたらheader()でレスポンスヘッダに出力できます。ただこの関数は「出力の前にコールする必要がある」そうですから、その点だけは注意が必要です。

CakePHPなら基底クラスのbefore_render()辺りに1箇所書くだけでOKですね。

WordPressの場合は・・・テーマの編集で「ヘッダー (header.php)」の先頭に書くのが無難ですかね。

<?php
// フレームセットの一部として表示される事を禁止
header('X-FRAME-OPTIONS: DENY');

?><!DOCTYPE ・・・・

もちろんCakePHPのレイアウトファイルに仕込む事もできますけどね。

ここで注意して頂きたいのですが、レスポンスがXHTMLの場合、上記ソース5行目の「?>」の後ろに改行を入れちゃダメです。XHTMLはファイルの先頭に改行コードが入っているとブラウザで表示されませんからね。

こんな感じです。IE8で始まったこの機能ですが、人によっては「効果が限定的なのにユーザーが油断してしまう」等の批判もあるようですが、それは言い過ぎでしょう。セキュリティ対応なんて全て効果は限定的なんですから。手間の割に簡単なので、これはいいと思いますよ~。

補足:
 サンプルを作って確かめてみましたが、他ブラウザでは Chrome5.0.375,Opera10.54,Safari5.0.2 が対応していました。


コメントを残す