web-dev-qa-db-ja.com

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

さて、このページに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を取得しようとすると、同じアクセス拒否エラーが発生し続けます。だから、サブドメインでさえクロスサイトスクリプティングとしてカウントされるように見えますが、それは正しいのでしょうか、それとも何か間違っているのでしょうか?

162
chronofwar

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

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

19
Dan Herbert

はい。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により、「Originでフレームがブロックされました...」

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

  • コンテナiframe @ドメイン1
  • 子iframeをドメイン2に送信します
  • しかし、子iframeでは...ドメイン2はドメイン3にリダイレクトし(つまり、認証、おそらくSAML)、ドメイン3はbackをドメイン2にリダイレクトします(フォーム送信を介して( )、標準のSAMLテクニック)
  • 子iframeの場合、document.referrerはDomain3であり、含まれるDomain1

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

317
Vaibhav

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

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

45
Gregory Lewis

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

var currentUrl = document.referrer;

そして-ここにメインのURLがあります!

28
ParPar

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

親フレームと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

16
user409021

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

10

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

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

2
Hyzer Deeds
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
user3523340

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

1
TARKUS

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

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

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

1
Dan

クロムでは、location.ancestorOriginsを使用できます。すべての親URLを返します。

0
Gena Moroz

それを試してみてください:

document.referrer

変更すると、ホストは「リファラー」であるiframeにいます。

私は彼が非常に古いことを知っていますが、あるドメインから別のドメインにCookieを渡すことを推奨する人はいません。サブドメインを使用しているため、CookieをURL .basedomain.comに設定するだけで、ベースドメインからすべてのサブドメインにCookieを共有できます。

その後、Cookieを介して必要なデータを共有できます。

0
Bruce