web-dev-qa-db-ja.com

iFrameのサードパーティサイトフレームを介してサイトページが読み込まれないようにする方法

ページの読み込み中に、自分のページが他のサイトのフレームとして埋め込まれていることを確認するにはどうすればよいですか?リファラーリクエストヘッダーはここで私を助けることができないと思いますか?ありがとう。

72
abovesun

サーバー側から確認することはできませんが、ページが読み込まれた後にjavascriptを使用して検出することができます。 topselfを比較し、それらが同一でない場合、フレーム内にいます。

さらに、一部の最新のブラウザはX-FRAME-OPTIONSヘッダー。2つの値を持つことができます。

  • DENY –ページがフレームに含まれている場合、ページがレンダリングされないようにします
  • SAMEORIGIN –ページがトップレベルのフレームセットホルダーと同じドメインに属している場合を除き、上記と同じです。

ユーザーにはGoogleのPicasaが含まれており、フレームに埋め込むことはできません。

ヘッダーをサポートするブラウザー、最小バージョン:

  • IE8およびIE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9( NoScript の古いバージョン)
92
Maerlyn

Stackoverflowには、テストするためのJSが含まれています(master.js)。これは関連する部分です。

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

ただし、JSは無効にできることに注意してください。

40
Felix Kling

モダンブラウザ の場合は、標準のCSP(コンテンツセキュリティポリシー)を使用できます。次のヘッダーは、ドキュメントがどこのフレームにもロードされないようにします。

Content-Security-Policy: frame-ancestors 'none'

(ただし、IE 11ではX-プレフィックスが必要です)。 'none'を、自分のサイトなど、フレーミングが許可されているOriginに変更することもできます。

古いブラウザをカバーするには、 @ Maerlyn's answer と一緒に使用するのが最適です。

25
rvighne

javaScriptを使用してiframeにページをロードしないようにすることができます

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

このコードは、ページのiframeのコンテナのアドレスをページアドレスに変更し、コンテナにページを表示するように強制します。

14
iman

または、特定の場所でコンテンツを気にしたくないが特定のサイトではそれを望まない場合は、特定のドメインをブロックできます。たとえば、offendingdomain.comがコンテンツを埋め込みました。これを行うことができます。

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

これにより、親ドキュメントの場所が確認され、offendingdomain.comコンテンツを埋め込みます。このスクリプトは、そのiframeを特定の有名なyoutubeビデオに罰として送信します。実際には、彼らは自分自身をリックロールしました。

6
earl3s

Javascriptを使用して、phpファイルの最後に次のスクリプトを配置してiframeにロードされたかどうかを確認し、iframeを使用してページをロードしないように警告または通知を表示するページにリダイレクトします。

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>
2
jmslouie