他のサイトがあなたのサイトを「フレーム」化することを望まないとします<iframe>
:
<iframe src="http://example.org"></iframe>
そこで、すべてのページにフレーム解除とフレーム破壊の JavaScript を挿入します。
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
素晴らしい! これで、包含する iframe を自動的に「破壊」または解除できます。ただし、小さな問題が 1 つあります。
結局のところ、フレームバスティングコードは破壊される可能性がある。ここに示すように:
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
このコードは次のことを行います。
window.onbeforeunload
ブラウザが現在のページから移動しようとするたびに、イベントハンドラを介してカウンターを増分します。- を介して1ミリ秒ごとに起動するタイマーを設定し
setInterval()
、カウンターが増加した場合は、現在の場所を攻撃者の制御下にあるサーバーに変更します。 - そのサーバーはHTTPステータスコード204のページを提供し、ブラウザはどこにも移動しません。
私の質問は、実際の問題というよりは JavaScript パズルなのですが、フレーム破壊バスターにどう対処すればよいかということです。
いくつか考えはありましたが、私のテストでは何も機能しませんでした。
onbeforeunload
イベントをクリアしようとしてもonbeforeunload = null
効果はありませんでした- プロセスを停止すると、
alert()
ユーザーにプロセスが起こっていることを知らせますが、コードには一切干渉しません。[OK]をクリックすると、通常どおりにバスト処理が続行されます。 setInterval()
タイマーをクリアする方法が思いつかない
私は JavaScript プログラマーではないので、ここで皆さんに挑戦してみます。ねえバスター、フレームを破壊するバスターを破壊できますか?
ベストアンサー1
ちなみに、最新のブラウザサポートのX-フレームオプション: 拒否スクリプトが無効になっている場合でも機能するディレクティブ。
IE8:
http://blogs.msdn.com/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
ファイアフォックス(3.6.9)
https://bugzilla.mozilla.org/show_bug.cgi?id=475530
https://developer.mozilla.org/en/The_X-FRAME-OPTIONS_response_header
Chrome/Webkit
http://blog.chromium.org/2010/01/security-in-depth-new-security-features.html
http://trac.webkit.org/changeset/42333