「 iframeがクロスドメインかどうかを確認するための確実な方法 "に対する回答は、ページ上のiframeが同じドメインまたはクロスドメインページを指しているかどうかをテストする方法を説明しています、異なるブラウザのクロスドメインポリシーの解釈に対処し、ユーザーを妨害したりJavaScriptを停止したりするエラーメッセージを回避します。
これと同等ですが、 from iframe内の子ページ inside クロスドメインiframeかどうかをテストしていますか否か。
親に関する(同じドメイン)情報にアクセスparent
グローバルを使用して可能です。 _parent.document.location
_、しかし、親がクロスドメインであることを検出したときに、エラーにクラッシュすることなくこのクロスブラウザを実行する信頼できる方法はありますか?
便利なテストのために、ここに jsbin が jsfiddleの中にあります。これは、_parent.location.Host
_がアクセス可能かどうかをテストしようとすると、エラーにクラッシュします。エラーの代わりに、これがクロスドメインの親であることをfalse
に通知するような信頼できる方法はありますか?
堅牢なクロスブラウザとなる_try...catch
_バリアントはありますか?または、parent.postMessage()
からの戻り値を使用した巧妙なトリックかもしれません。 (ただし、親ページは編集できません)
使用例:独自のサイトのページに埋め込まれる埋め込みコンテンツや、サードパーティによって埋め込まれるコンテンツを想像してください。ページが同じドメインのiframeにある場合、ユーザーは既にここにいるため、ブランドと非表示のリンクを元のサイトに戻します。ユーザーがサードパーティのiframeからページにアクセスしたり、ページを直接読み込んだりすると、ブランディングとクレジットが表示され、コンテンツのソースを確認できます。
明確にするために、私は同じドメインのポリシーについて知っていて、何クロスブラウザドメインが気にしない、私は単純ですが信頼できるif
if( crossDomainParent() ){ /* do something */}
のような条件
最初にIFramedかどうかを確認します。
window.self !== window.top
IFramedの場合、参照元は親フレームのURLです。
document.referrer
このURLから、コードを分岐するかどうかを検出できるはずです。
後世のための実際のクロスブラウザソリューション:
function isCrossOriginFrame() {
try {
return (!window.top.location.hostname);
} catch (e) {
return true;
}
}
console.log(isCrossOriginFrame());
デスクトップブラウザーとモバイルブラウザーの適切な範囲でテストされています。
x-frameヘッダーを使用します。これにより、サイトをframe/iframeにロードできなくなります。さまざまなオプションがあります ここをお読みください
私はリファラーを使用してクロスドメインを決定しようとしましたが、多くのサイトでは信頼できないことがわかりました。多分誰かがこれが便利だと思うでしょう。
function IsCrossDomainFrame() {
if( parent === window ) return false; //not a frame
var parentLocation = new URL(document.referer);//the referer of an iframe is the parent
return (parentLocation.protocol !== location.protocol ||
parentLocation.hostname !== location.hostname ||
parentLocation.port !== location.port);
}
プロトコル、ホスト名、およびポートは、クロスドメインを決定します。
これを試してください(iframe内)
<script type="text/javascript">
var detectOrigin = (window.location.ancestorOrigins === undefined ?
/example.com/.test(document.domain) /* firefox */ :
/example.com/.test(window.location.ancestorOrigins[0])); /* webkit */
if (detectOrigin === true) {console.log(detectOrigin)}; /* `true` example.com Origin */
if (detectOrigin === false) {console.log(detectOrigin)}; /* `false` !example.com Origin */
</script>
私があなたのユースケースを見た場合:
$_SERVER['REMOTE_ADDR']
を使用して、サーバー側(サイトを呼び出した人)を確認します。IPの場合は、ブランディングを隠してバックをリンクできます。
ユースケースがサイトのフレーミングを防止しようとしている場合は、X-Frame-Options: deny
を使用できます。
その他の推測:ドキュメント内の要素にはownerDocument
プロパティがあります。これは、必要なものを検出するのに役立つ場合があります。
現在の制限では、DOM APIを使用してこれを実現する方法はありません。別のドメインに属するウィンドウを使用した評価では、エラーが発生します。
ただし、「ハッキング」とは、XHRを子ウィンドウから送信して、ドメイン内の既知のページをロードすることです。このXHRが正常に完了すると、両方のウィンドウが同じドメインであることがわかります。
ただし、これによりコンソールにエラーメッセージが記録されます。
ネストされたiframeの場合:iframe(このコードが実行される場所)がクロスドメインかどうかを再帰的に知る方法:
function crosDomIfrm(win, data) {
data = (typeof data === 'undefined')?{ref:win.document.location,isCD:false}:data;
try {
if( win.document.referrer != '' ){
data.isCD = parseURL(data.ref) != parseURL(win.document.referrer);
}
} catch(e){}
if ( (win.self !== win.parent) && !data.isCD ) { //I'm in iframe
data = crosDomIfrm( win.parent, data );
}
return {ref:data.ref,isCD:data.isCD};
},
function parseURL(url) {
var a=document.createElement('a');
a.href=url;
return a.hostname;
}