web-dev-qa-db-ja.com

iframeドキュメントオブジェクトへのアクセスに関する「アクセスが拒否されました」エラー

AJAXフォームに多くのパラメータを持つフォームを投稿するために、私はiframeを作成し、POSTでフォームを投稿し、iframeのコンテンツ、具体的には、次のようにコンテンツにアクセスしています。

$("some_iframe_id").get(0).contentWindow.document

私はそれをテストし、機能しました。

一部のページで、「アクセスが拒否されました」というエラーが表示され始めました。私の知る限り、同じドメインからiframeが提供される場合、これは起こりません。

以前は機能していたと確信しています。誰にも手がかりがありますか?

十分に明確でない場合:同じドメインに投稿しています。したがって、これはクロスドメインリクエストではありません。私はIEのみでテストしています。

追伸単純なajax POSTクエリを使用できません(質問しないでください...)

25
Ovesh

自分で解決しました!

問題は、正しい応答が送信されていても(Fiddlerで検証済み)、HTTP 200エラーコード(200ではなく)で送信されていたことでした。

応答がエラーコードで送信された場合、IEはiframeの内容をディスクからロードされたエラーメッセージ(res://ieframe.dll/http_500.htm)、それが原因でクロスドメインアクセス拒否エラーが発生します。

50
Ovesh

iFramesに関連するセキュリティ制限に注意してください。たとえば、Cross domain制限(別名CORS)。以下は、CORSに関連する3つの一般的なエラーです。

  1. 別のドメインでiFrameをロードします。 (例:「www.foo.com」を開き、トップフレームが「www.ooof.com ")

  2. 別のポートでiFrameをロードします。iFrameのURLportは、上のフレームのURLとは異なります。

  3. 異なるプロトコル:親フレームがHTTPを使用している間にHTTPS経由でiFrameリソースをロードします。

6
Gal Blank

私の問題はX-Frame-Options HTTPヘッダー。私のApache構成では次のように設定されています:

Header always append X-Frame-Options DENY

削除すると機能しました。特に私の場合、jQueryのiframeトランスポートを使用してjQueryファイルアップロードプラグインを使用して、IE 9およびIE 10。

3
gak

私はこの質問が非常に古いことを知っていますが、上記の答えが私のために働いたことを言及したかったです:document.domainを各ページ(親ページとiframeページ)で同じに設定します。しかし、私の検索では、この興味深い記事を見つけました。

http://softwareas.com/cross-domain-communication-with-iframes

2
Groovetrain

src='javascript:void(0)'を含むiframeがある場合は、frame.document.location =...はIEでアクセス拒否エラーで失敗します。ターゲットフレームと対話するjavascriptライブラリを使用していました。フレームを変更しようとしていた場所が親と同じドメイン上にあったにもかかわらず、iframeは最初にjavascript:voidに設定され、クロスドメインアクセス拒否エラーがトリガーされました。

これを解決するために、サイトにblank.htmlページを作成し、javascriptで変更されるまで最初は空白になるiframeを事前に宣言する必要がある場合は、src='/content/blank.html'は同じドメインにあります。

あるいは、作成時にsrcを設定できるように、javascriptを使用してiframeを完全に作成することもできますが、私の場合は、iframeをページで宣言する必要があるライブラリを使用していました。

2
AaronLS