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


133

一部のWebサイトには、IFRAMEエンクロージャから「抜け出す」ためのコードがあります。つまり、ページAIFRAME親ページの内部として読み込まれた場合、PJavaScript Aによって外部ウィンドウがにリダイレクトされAます。

通常、このJavascriptは次のようになります。

<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

私の質問は次のとおりです。親ページの作成P者であり、内部ページの作成者ではないので、このブレイクアウトAを防ぐにはどうすればよいAですか?

PSそれはクロスサイトセキュリティ違反であるはずだと私には思われますが、そうではありません。


あなたがフレームコンテンツの作者でないなら、あなたはほとんど何もすることができないと思います...
scunliffe 2008

回答:


43

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

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

HTML5では、サンドボックスプロパティを使用できます。以下のパンクラットの回答をご覧ください。 http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
ただし、iFrame では、を使用したクロスドメイン通信可能postMessageです。これはセキュリティ上のリスクではありませんが、あなたのコメントを見たときに、誰かがこの機能が存在することを知りたいと思うかもしれません。:)
coreyward

この回答を書いている時点では不可能でした。ご指摘ありがとうございます。
fasih.rana

@SirDariusに例を示してください、非常に高く評価されています。
user198989

ユーザーはこの確認が表示される理由を知らず、おそらくランダムな応答を選択します。使用はお勧めしません。他のソリューションがありますsandbox
oriadam

1
@ fasih.rana 2番目の記事は私を大いに助けてくれました。ありがとう;)
MrD

127

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

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

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


待って...何?彼らはあなたにこれをさせましたか?ウェブサイトがブレイクしたいのなら、すべてのブラウザがそれを許可するだろうと私は思った。これで、人々はどのようにして自分のウェブサイトをiframesから遠ざけることになっていますか?私は文句を言っていません、素晴らしい。
Farzher


1
@StephenSarcsamKamenar iframeに表示されないようにサイトを保護する場合は、SAMEORIGIN値で使用できるX-Frame-Optionsヘッダーがあります。最新のブラウザのほとんどは、このヘッダーがあるサイトをiframeに表示しません。
Grzegorz 2013

4
残念ながらsandbox、サンドボックス化されたフレームでFlashまたは他のタイプのオブジェクトを許可しないためsandbox、多くの場合、この機能は役に立たなくなります。
oriadam

1
ウェブサイトは、iframeに含まれていることに抗議するために「抜け出す」べきではありません。メッセージを表示するか、空白にすることができます。残念ながら、スクリプトをiframeで実行できるようにすると、while(1){}およびその他の無限ループを実行する悪質なiframeが開かれます。各iframeが独自のスレッドを取得できることを願っています。
Gregory Magarshak 2017年

51

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

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

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

例。

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

3
Flash(およびその他のオブジェクト)もブロックされることに注意してください。許可するオプションはありません。この「セキュリティ機能」により、サンドボックスを一緒に使用することができません
oriadam

8

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

を設定sandbox=""すると、iframeがリダイレクトされなくなります。とは言っても、iframeはリダイレクトされません。あなたは本質的にクリックを失うでしょう。

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


4

私は質問が行われてから長い時間が経過していることを知っていますが、ここに私の改良版があります。それは、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();"フレームまたはインラインフレームに追加する必要があります。



2

iframe内にロードするページは、setIntervalを使用して「ブレークアウト」コードを実行できるため、onbeforeunloadはそれほど現実的ではない可能性があります。ダイアログ。

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

:(


2

私の場合、ユーザーに内部ページにアクセスしてもらい、サーバーが訪問者として自分のIPを表示できるようにします。私がphpプロキシテクニックを使用している場合、内部ページには私のサーバーのIPがビジターとして表示されるため、良くありません。これまでに得た唯一の解決策は、onbeforeunloadを使用することです。これをあなたのページに置いてください:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

これは、FirefoxとIEの両方で機能します。つまり、私がテストしたものです。evt.return(whatever)crap ...のようなものを使用しているバージョンが見つかりますが、Firefoxでは機能しません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.