web-dev-qa-db-ja.com

安全でないJavaScriptがURLを使用してフレームのナビゲーションを開始しようとしました

これは少し複雑です、ご容赦ください。ウェブサイトAにはウェブサイトBを含むiframeがあり、ウェブサイトBにはウェブサイトCを含むiframeがあります。

ウェブサイトCにボタンがあります。クリックすると、ウェブサイトBのURLを更新します。以下は、iframe内にあるウェブサイトCからウェブサイトBを更新するために呼び出されるJavaScriptです。

function url_update(id){
   var Host = 'https://websiteb.com ';
   var myHost = Host.split('/'); 
   if (id != "" && myHost != ""){
    try {
        if (id.substring(0,1) != '/'){
            id = '/' + id;
        }
        var dft_url = myHost[0] + '//' + myHost[2] + id;
        window.parent.location.href = dft_url;
    } catch(e){alert("Cannot go to the desired url location: " + dft_url);}
   } 
 }

ただし、「window.parent.location.href = dft_url;」という行の場合実行されると、次のエラーが発生しました。

 Unsafe JavaScript attempt to initiate navigation for frame with URL  
 'https://websiteB.com' from frame with URL
 'https://websiteC.com'. The frame attempting navigation is 
  neither same-Origin with the target, nor is it the target's parent or    
  opener.

なぜこれが起こっているのか、そしてそれを修正する方法がわかりません。どんな助けでもありがたいです。

私はいくつかの調査を行いましたが、これはOriginの問題であるとほとんどの人が主張しましたが、WebサイトAを削除すると、WebサイトCを含むiframeを備えたWebサイトBしかないと、上記のコードは機能します。ドメインが異なっていても

10
Noob Coder

この動作の説明は、Chromiumソースコードのコメントにあります。ここを参照してください:

https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/core/frame/Frame.cpp&sq=package:chromium&rcl=1438193817&type=cs&l=202

基本的に、トップレベルウィンドウには、他のウィンドウよりもナビゲーションに関する制限が少なくなっています。トップ以外のウィンドウの制限を参照してください。

ドキュメントはその子孫フレームをナビゲートできます。または、より一般的には、ドキュメントがそのフレームの祖先(フレーム階層内)のいずれかと同じオリジンにある場合、ドキュメントはフレームをナビゲートできます。

トップウィンドウはどこですか:

具体的には、そのフレームがドキュメントを開いた場合、またはドキュメントが同じである場合、ドキュメントはトップレベルフレームをナビゲートできます-オリジンは、トップレベルフレームのオープナーの祖先(フレーム階層内)のいずれかと同じです。

その理由は次のとおりです。

トップレベルフレームは、(ほとんどのブラウザで)アドレスバーにURLを表示するため、他のフレームよりもナビゲートしやすいです。

したがって、基本的に、トップウィンドウ以外の場合、ナビゲーションを許可するには絶対に同じOriginである必要がありますが、トップウィンドウの場合、そのウィンドウによって開かれたフレームは、同じでない場合でもナビゲートできます-Origin。これはあなたが直面している問題のようです。Bがトップの場合、同じOriginは適用されませんが、トップでない場合は適用されます。

これによると、簡単な解決策があるか、まったく解決策があるかはわかりません。

11