iframeから親URLにアクセスする


187

さて、私は上のページとこのページにiframeを持っています。私がする必要があるのは、iframeページです。メインページのURLを確認してください。

私は周りを検索しましたが、iframeページが別のドメインにある場合、それはクロスサイトスクリプティングであるため、これは不可能であることを知っています。しかし、私が読んだすべての場所で、iframeページが親ページと同じドメインにある場合、たとえば、次のようにすると機能するはずです。

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

...または他の同様のコンボ。同じ情報を取得するには複数の方法があるようです。

とにかく、ここに問題があります。私のiframeはメインページと同じドメインにありますが、同じSUBドメインにはありません。だから例えば私は持っています

http:// www.mysite.com/pageA.html

そして、私のiframe URLは

http:// qa-www.mysite.com/pageB.html

pageB.html(iframeページ)からURLを取得しようとすると、同じアクセス拒否エラーが発生し続けます。それで、サブドメインでさえクロスサイトスクリプティングとして数えられるようです、それは正しいですか、それとも私は何か間違っていますか?


フレームURLで渡すだけでいいですか?など<iframe src="url?parent=parent-url"></iframe>
Biagio Arobba

回答:


21

あなたは正しいです。iframeを使用する場合、サブドメインは引き続き別個のドメインと見なされます。を使用してメッセージを渡すことは可能ですpostMessage(...)が、他のJS APIには意図的にアクセスできなくなります。

コンテキストに応じて、URLを取得することも可能です。詳細については、他の回答を参照してください。


1
よく吹くだけでいい。しかし、少なくとも私は狂っていないことを知っています:(ああ、計画B.ありがとう(そして、編集に感謝して私のものをタグに入れないことについて申し訳ありません)
chronofwar

9
これは選択された答えですか?考えられる解決策については、以下に説明があります。
Anoyz、2014

1
同意しました!以下の80票での回答の方がはるかに優れています。この回答はHTML仕様にあります。
リゲマー2014年

4
2の間で対話できますが、親とiframeの両方に次のスクリプトを追加する必要があります。<script> document.domain = "mydomain.com"; </ script>
George

2
「詳細については、他の回答を参照してください。」ははそれのようなものです:私には解決策がありません、他の答えを見てください、しかし私の答えも受け入れてください。
Milad 2018年

370

はい、iframeとメインページが同じ(サブ)ドメインにない場合、親ページのURLへのアクセスは許可されません。ただし、メインページのURL(ブラウザのURLなど)だけが必要な場合は、次のようにしてみてください。

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

注意:

window.parent.location許可されている; これは、hrefプロパティへのアクセスによって引き起こされるOPのセキュリティエラーを回避しwindow.parent.location.hrefます。

document.referrer「このページにリンクしているページのURI」を指します。他のソースが場所を決定したものである場合、これは含まれているドキュメントを返さない場合があります。次に例を示します。iframe

  • ドメイン1のコンテナiframe
  • 子iframeをドメイン2に送信します
  • しかし、子iframe内に...ドメイン3(すなわち認証のための、多分SAML)、[ドメイン3に、ドメイン2つのリダイレクトを指示し、バックドメイン2(すなわち経由してフォーム送信()、標準のSAML技術)に
  • 子iframeのdocument.referrer場合、これはドメイン1でなく、ドメイン3になります。

document.location「ドキュメントのURLに関する情報を含むLocationオブジェクト」を参照します。おそらく現在のドキュメント、つまり現在開いているiframeです。の場合window.location === window.parent.location、iframe hrefは、それを含む親のと同じhrefです。


1
@jepserは、iframeがそのiframe内にあるためです。真ん中にあるトップフレームにアクセスすることはできません。ネストされたクロスドメインiframeは、非常に多くのレベルで間違っています。しかしdocument.domain、一番上のフレームと一番内側のフレームに設定すると、それを回避できる場合があります。多分。
gcb 2013年

2
または、もう少しコンパクトに:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth 2014

2
コンテナーがローカルホストにある場合(または、より一般的には、このページがWebサーバーによって開かれていない場合)またはfile://によって呼び出された場合は機能しません。
Guillaume Renoult、2015

5
これはReferer-Policyヘッダーで無効にできることに注意してください。
Dan Atkinson

2
これは、エッジのブラウザで動作するようには思えない-リファラは、空の文字列になります。.. stackoverflow.com/questions/24169219/...
ダヴィデオラツィオMontersino

51

この問題の非常に単純な回避策を発見しましたが、それについて言及している議論はどこにも見つかりませんでした。親フレームの制御が必要です。

iFrameで、このiframeが必要だと言います:src = "http://www.example.com/mypage.php"

まあ、iframeを指定するためにHTMLの代わりに、JavaScriptを使用してiframeのHTMLを作成し、「ビルド時に」javascriptを介して親URLを取得し、srcターゲットのクエリ文字列でURL GETパラメータとして送信します。そう:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

次に、URL文字列を解析して目的のURL変数を取得するJavaScript URL解析関数を自分で見つけます。この場合は「url」です。

私はここで素晴らしいURL文字列パーサーを見つけました:http : //www.netlobo.com/url_query_string_javascript.html


この回答とstackoverflow.com/a/7739035/216084を組み合わせることで、仕事が完了します。

2
これは素晴らしい提案でした。親のhtml iframeコードを書いている人にとっては、これで十分です。ピクセルソフトウェアで非常によく似たものを使用しました。
リゲマー2014年

ありがとうございました!!これは、依然としてクロスサイトルールを尊重する効果的な回避策です。
theUtherSide 2015

しかし、サーバーでhtml内のすべてのURLを書き換えますか?それ以外の場合、ユーザーがiFrameのリンクをクリックしても、アクセスできません。
Roel

@Roelあなたはそれらすべてをサーバー時に書くことができます(本質的に、この答えを「ハードコード」する)、またはこの答えは、たとえばページがロードされた後、望ましいiframeを挿入した後、JavaScriptで行うことができます。
rogerdpack 2016年

34

iframeが別のドメイン(クロスドメイン)からのものである場合、これを使用する必要があります。

var currentUrl = document.referrer;

そして-ここにあなたはメインのURLを持っています!


私の場合、iFrame自体が動的に生成されたか、他のいくつかのトリックが行われたと思うので、それはうまくいきませんでした。とにかく期待した答えが得られませんでした。
Muskie、2013年

これはすべてのブラウザで機能するはずです。サンドボックス化パラメーターを送信する場合、新しいブラウザーでない限り、これは事実です。これは、クロスドメインに関係なく機能します。
gcb 2013年

iframe内のページがJavaScript(例:)を介して再ロードされた場合、window.location.reload(true)これは機能しなくなります。次に、リファラーはiframe自体のURLです。
mori

20

同じドメインと異なるサブドメインのページの場合、document.domainJavaScriptを介してプロパティを設定できます。

親フレームとiframeの両方で、それらのdocument.domainをそれらの間で一般的なものに設定する必要があります。

つまり www.foo.mydomain.comapi.foo.mydomain.comそれぞれがどちらか一方foo.mydomain.comまたは両方を使用してmydomain.com互換性がある可能性があります(いいえ、comセキュリティ上の理由から、両方をに設定することはできません...)

また、document.domainは一方通行であることに注意してください。次の3つのステートメントを順番に実行することを検討してください。

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

最新のブラウザーはwindow.postMessageを使用してオリジン間で通信することもできますが、IE6では機能しません。 https://developer.mozilla.org/en/DOM/window.postMessage


3
これが可能であり、この回答がGoogle検索で表示されるようになったので、これを回答として受け入れてください。
メタグラファ

17

次の行は機能します。document.location.ancestorOrigins[0]これは祖先ドメイン名を返します。


Chromeに加えられた変更に続いて、これは多くのブラウザーにとって正しい答えになりました。
Dan Atkinson

ただし、完全なURLではありません。ドメインのみ
TheMaster

document.location.ancestorOrigins戻ってundefined私のために
ミゲル・モタ


2

これに関して問題がありました。ページが最初にiframeグラブに読み込まれ、$_SERVER['HTTP_REFFERER']それをセッション変数に設定するときに、phpなどの言語を使用している場合。

このようにして、ページがiframeに読み込まれると、それを読み込んだページの完全な親URLとクエリ文字列がわかります。クロスブラウザーのセキュリティでは、異なるドメインの場合、window.parentを数えるのは少し頭痛の種です。


2
var url = (window.location != window.parent.location) ? document.referrer: document.location;

上記の例は、スクリプトがiframeで実行されているときに以前は機能していたが、iframeの外でスクリプトが実行されたときにURLを取得しなかったため、若干の調整が必要であることがわかりました。

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

2
iframeの外にいる場合は、親フレームでスクリプトを実行しているため、何もチェックする必要はありません。
Art3mix 2018

1

以前のソリューションを機能させるhttp:otherdomain.com/page.htm?from=thisdomain.com/thisfolderことはできませんでしたが、たとえばiframe scrを設定すると、iframe抽出でthisdomain.com/thisfolder次のjavascriptを使用して実行できることがわかりました。

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

1

PHP $ _SERVER ['HTTP_REFFERER']の問題は、親ページに移動したページの完全修飾ページURLを提供することです。これは、親ページ自体とは異なります。さらに悪いことに、親ページのURLにユーザーが入力したため、http_refererがない場合があります。そのため、yahoo.comから親ページにアクセスすると、yahoo.comはページではなくhttp_refererになります。


1

うまく$_SERVER['HTTP_REFERER']いかない場合(私はあなたを見ている、Safari)$_SERVER['REDIRECT_SCRIPT_URI']が便利なバックアップであることがわかりました。


0

クロムではlocation.ancestorOriginsを使用することが可能ですそれはすべての親URLを返します


0

私は彼がとても古いことを知っていますが、それは私の心を吹き飛ばします。サブドメインを使用しているので、URLにCookieを設定するだけで、ベースドメインからすべてのサブドメインにCookieを共有できます.basedomain.com

次に、Cookieを介して必要なデータを共有できます。



-4

すべての親iframe関数とHTMLを取得する

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;

jQueryを使用しない私たちのためにこの答えを拡張できるとは思いません(この数年でjQueryが不要になっているため、数が増えているので、指摘する必要があります)。少なくとも、この回答がjQueryに依存していることを明確にすることをお勧めします。OPはjQueryについてまったく触れていません。
Carnix 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.