さて、このページに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を取得しようとすると、同じアクセス拒否エラーが発生し続けます。だから、サブドメインでさえクロスサイトスクリプティングとしてカウントされるように見えますが、それは正しいのでしょうか、それとも何か間違っているのでしょうか?
正解です。 iframeを使用する場合、サブドメインは依然として別個のドメインと見なされます。 postMessage(...)
を使用してメッセージを渡すことは可能ですが、他のJS APIは意図的にアクセスできなくなります。
コンテキストに応じてURLを取得することも可能です。詳細については、他の回答を参照してください。
はい。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
の場所を決定したものである場合、を含むドキュメントを返すことがあります:
document.referrer
はDomain3であり、含まれるDomain1document.location
は、「ドキュメントのURLに関する情報を含むLocationオブジェクト」を指します。おそらくcurrent文書、つまり現在開いているiframe。 window.location === window.parent.location
の場合、iframeのhref
は、親を含むhref
と同じsameです。
この問題の回避策が非常に簡単であることがわかりましたが、それについて言及している議論はどこにも見つかりませんでした。親フレームの制御が必要です。
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
Iframeが別のドメイン(クロスドメイン)からのものである場合、単にこれを使用する必要があります。
var currentUrl = document.referrer;
そして-ここにメインのURLがあります!
同じドメインと異なるサブドメインのページでは、javascriptを介してdocument.domain
プロパティを設定できます。
親フレームとiframeの両方で、document.domainをそれらの間で一般的なものに設定する必要があります。
つまり、www.foo.mydomain.com
とapi.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
次の行が機能します:document.location.ancestorOrigins[0]
これは先祖ドメイン名を返します。
これには問題があります。ページがiframeグラブに最初に読み込まれるときにphpなどの言語を使用している場合は$_SERVER['HTTP_REFFERER']
をセッション変数に設定します。
このようにして、ページがiframeに読み込まれると、それを読み込んだページの完全な親URLとクエリ文字列がわかります。クロスブラウザのセキュリティでは、異なるドメインを使用している場合、window.parentを頼りにするのは少し頭痛の種です。
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;
PHP $ _SERVER ['HTTP_REFFERER']の問題は、親ページに移動したページの完全修飾ページURLを提供することです。親ページ自体とは異なります。さらに悪いことに、人が親ページのURLを入力したため、http_refererがない場合があります。したがって、yahoo.comから親ページにアクセスすると、yahoo.comがページではなくhttp_refererになります。
以前のソリューションを機能させることはできませんでしたが、たとえば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];
$_SERVER['HTTP_REFERER']
が機能しない場合(Safariを探しています)、$_SERVER['REDIRECT_SCRIPT_URI']
が便利なバックアップであることがわかりました。
クロムでは、location.ancestorOriginsを使用できます。すべての親URLを返します。
それを試してみてください:
document.referrer
変更すると、ホストは「リファラー」であるiframeにいます。
私は彼が非常に古いことを知っていますが、あるドメインから別のドメインにCookieを渡すことを推奨する人はいません。サブドメインを使用しているため、CookieをURL .basedomain.com
に設定するだけで、ベースドメインからすべてのサブドメインにCookieを共有できます。
その後、Cookieを介して必要なデータを共有できます。