一部のWebサイトには、IFRAME
エンクロージャーを「ブレイクアウト」するコードがあります。つまり、ページA
が親ページIFRAME
内のP
としてロードされると、A
のJavascriptが外部ウィンドウをA
にリダイレクトします。
通常、このJavascriptは次のようになります。
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
私の質問は、親ページP
の作成者であり、内部ページA
の作成者ではないので、A
がこのブレークアウトを行うのを防ぐにはどうすればよいですか?
追伸それはクロスサイトのセキュリティ違反であるように思えますが、そうではありません。
Onbeforeunloadプロパティを使用してみてください。これにより、ユーザーはページから移動するかどうかを選択できます。
例: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
HTML5では、sandboxプロパティを使用できます。以下のPankratの回答をご覧ください。 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
HTML5では、 iframeサンドボックス 属性が追加されました。これを書いている時点では Chrome、Safari、Firefox、およびIEおよびOperaの最近のバージョンで動作します ですが、ほとんど何でもしたいです:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
トップレベルのリダイレクトをallowにする場合は、sandbox="allow-top-navigation"
を指定します。
Sandbox = "..."を使用します
トップナビゲーションはあなたが防止したいものなので、それを省くとそれは許可されません。残ったものはブロックされます
例.
<iframe sandbox="allow-same-Origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
w3.org仕様 を読んだ後。サンドボックスプロパティを見つけました。
Iframeのリダイレクトを防ぐsandbox=""
を設定できます。そうは言っても、iframeはリダイレクトされません。基本的にクリックは失われます。
ここの例: http://jsfiddle.net/ppkzS/1/
サンドボックスなしの例: http://jsfiddle.net/ppkzS/
質問が行われてから長い時間が経っていることは知っていますが、これは私の改良版で、iframeがロードされた場合にのみ後続の呼び出しを500ミリ秒待機します。
<script type="text/javasript">
var prevent_bust = false ;
var from_loading_204 = false;
var frame_loading = false;
var prevent_bust_timer = 0;
var primer = true;
window.onbeforeunload = function(event) {
prevent_bust = !from_loading_204 && frame_loading;
if(from_loading_204)from_loading_204 = false;
if(prevent_bust){
prevent_bust_timer=500;
}
}
function frameLoad(){
if(!primer){
from_loading_204 = true;
window.top.location = '/?204';
prevent_bust = false;
frame_loading = true;
prevent_bust_timer=1000;
}else{
primer = false;
}
}
setInterval(function() {
if (prevent_bust_timer>0) {
if(prevent_bust){
from_loading_204 = true;
window.top.location = '/?204';
prevent_bust = false;
}else if(prevent_bust_timer == 1){
frame_loading = false;
prevent_bust = false;
from_loading_204 = false;
prevent_bust_timer == 0;
}
}
prevent_bust_timer--;
if(prevent_bust_timer==-100) {
prevent_bust_timer = 0;
}
}, 1);
</script>
onload="frameLoad()"
およびonreadystatechange="frameLoad();"
をフレームまたはiframeに追加する必要があります。
私の場合、サーバーに訪問者としてIPが表示されるように、ユーザーに内部ページにアクセスしてほしいです。私がPHPプロキシ技術を使用する場合、内部ページは訪問者として私のサーバーIPを見ると思うので、それは良くありません。私がこれまでに得た唯一の解決策は、onbeforeunloadのwilthです。あなたのページにこれを入れてください:
<script type="text/javascript">
window.onbeforeunload = function () {
return "This will end your session";
}
</script>
これは、Firefoxと、つまり、私がテストしたことの両方で機能します。 evt.return(whatever)crap ...のようなものを使用しているバージョンがありますが、これはfirefoxでは機能しません。
Iframe内にロードするページはsetIntervalを使用して「ブレークアウト」コードを実行できるため、onbeforeunloadはユーザーを「本当に終了しますか?」ダイアログ。
IEおよびOperaでのみ機能するiframeセキュリティ属性もあります
:(
そうすることで、フレーム化されたページのアクションを制御できますが、それはできません。 同じドメインの発信元ポリシー が適用されます。