2013-01-04 6 views
9

としてデータURIを使用していますインラインフレームにアクセスクロスドメインのセキュリティチェックが発生します。は、プログラム私は「データ」URIを使用してプログラムのiframeを作成していたソース

var iframeDoc = document.getElementById('myFrame').contentWindow.document; 
$(iframeDoc.body).find('h1').text('Changed'); 

はChromeとSafariでエラーを例外:

Unsafe JavaScript attempt to access frame with URL data:text/html;charset=utf-8,... from frame with URL http://... The frame requesting access has a protocol of 'http', the frame being accessed has a protocol of ''. Protocols must match.

は、ここでセキュリティエラーを示すフィドルです:http://jsfiddle.net/bhGcw/4/

FirefoxとOperaはこの例外をスローとiframeの内容をすることはできません。かわった。 WebkitはデータURIのための空のプロトコルを見て、これをクロスドメイン違反とみなしているようです。

これを回避する手段はありますか?

+1

これはこれですか? http://code.google.com/p/chromium/issues/detail?id=82402クロムではなくクロム用ですが、おそらく同じ問題があります。また、私はクロムが防止しようとするフィッシングのセキュリティ上の問題を発見しました。それもそうかもしれません – llamerr

+0

これは間違いなく関連しているようです。回避策があることを期待していましたが、そうではないように見えました。 –

答えて

5

Webkitのが彼らのdomain checking codeで、単純な文字列比較を行うことが表示されます:

String DOMWindow::crossDomainAccessErrorMessage(DOMWindow* activeWindow) 
{ 
    ... 

    SecurityOrigin* activeOrigin = activeWindow->document()->securityOrigin(); 
    SecurityOrigin* targetOrigin = document()->securityOrigin(); 
    if (targetOrigin->protocol() != activeOrigin->protocol()) 
     return message + " The frame requesting access has a protocol of '" + activeOrigin->protocol() + "', the frame being accessed has a protocol of '" + targetOrigin->protocol() + "'. Protocols must match.\n"; 

    ... 
} 

クロムは、HTML5仕様よりも厳格であること、少なくとも以下のバグレポートを従っているように見えます:

Chromium開発者は、このルールを緩和するのに好意的ではないようです。バマー。

+1

興味深いコメントですが、残念ながら質問には答えません – mems

7

データのURLを使用する代わりに、HTML5の属性srcdocを使用してください。答えは@jamieによって提唱さhttp://jsfiddle.net/ff3bF/

+2

srcdocはIE/Edgeでは動作しません。 – Seanonymous

+1

これはちょっと残念です。誰かがpolyfill(https://github.com/jugglinmike/srcdoc-polyfill)を作成しました。 – Jamie

3

の例があります

<iframe id="iframe" srcdoc='<html><body><h1>Hello!</h1></body></html>'></iframe> 
<script type="text/javascript"> 
    $(function(){ 
     $($("iframe")[0].contentWindow.document).find("h1").text("Modified from the parent window!"); 
    }); 
</script> 

はロードはiframeにHTMLおよびコンテンツ・ドキュメントと、その後のプログラムによる対話を可能にするために適しています。

XHTMLはあまり簡単ではありません。

srcdoc属性はHTMLに制限されているように見えますが、XHTMLには表示されません。

回避策は、を指定できるように、BlobのURLを使用することです。

var documentSource = '<?xml version="1.0" encoding="UTF-8"?>\n<html xmlns="http://www.w3.org/1999/xhtml">\n<head>...'; 
var blob = new Blob([documentSource], { type: "application/xhtml+xml" }); 
iframe.src = URL.createObjectURL(blob); 

この方法は、少なくともChrome、Firefox、Safariで動作します。

関連する問題