web-dev-qa-db-ja.com

IFRAMEがトップレベルウィンドウをリダイレクトしないようにする方法

一部の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がこのブレークアウトを行うのを防ぐにはどうすればよいですか?

追伸それはクロスサイトのセキュリティ違反であるように思えますが、そうではありません。

121
Jason Cohen

Onbeforeunloadプロパティを使用してみてください。これにより、ユーザーはページから移動するかどうかを選択できます。

例: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

HTML5では、sandboxプロパティを使用できます。以下のPankratの回答をご覧ください。 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/

40
fasih.rana

HTML5では、 iframeサンドボックス 属性が追加されました。これを書いている時点では Chrome、Safari、Firefox、およびIEおよびOperaの最近のバージョンで動作します ですが、ほとんど何でもしたいです:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

トップレベルのリダイレクトをallowにする場合は、sandbox="allow-top-navigation"を指定します。

120
Pankrat

Sandbox = "..."を使用します

  • allow-formsはフォームの送信を許可します
  • allow-popupsはポップアップを許可します
  • allow-pointer-lockは、ポインターのロックを許可します
  • allow-same-Originは、ドキュメントがOriginを維持できるようにします
  • allow-scriptsはJavaScriptの実行を許可し、機能が自動的にトリガーされることを許可します
  • allow-top-navigationは、トップレベルウィンドウをナビゲートすることにより、ドキュメントがフレームから抜けることを許可します

トップナビゲーションはあなたが防止したいものなので、それを省くとそれは許可されません。残ったものはブロックされます

例.

        <iframe sandbox="allow-same-Origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
42
adigioia

w3.org仕様 を読んだ後。サンドボックスプロパティを見つけました。

Iframeのリダイレクトを防ぐsandbox=""を設定できます。そうは言っても、iframeはリダイレクトされません。基本的にクリックは失われます。

ここの例: http://jsfiddle.net/ppkzS/1/
サンドボックスなしの例: http://jsfiddle.net/ppkzS/

7
Parris

質問が行われてから長い時間が経っていることは知っていますが、これは私の改良版で、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に追加する必要があります。

4
Luis Deleon
3
artur

私の場合、サーバーに訪問者として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では機能しません。

2
radu

Iframe内にロードするページはsetIntervalを使用して「ブレークアウト」コードを実行できるため、onbeforeunloadはユーザーを「本当に終了しますか?」ダイアログ。

IEおよびOperaでのみ機能するiframeセキュリティ属性もあります

:(

2
user47087

そうすることで、フレーム化されたページのアクションを制御できますが、それはできません。 同じドメインの発信元ポリシー が適用されます。