document.domain = document.domainは何をしますか?


90

Orbited(Cometサーバー)のクライアント側のJSコンポーネントでは、サーバーがJS自体とは異なるドメインまたはポートで実行されている場合は、実行する必要があります。

document.domain = document.domain;

他のJSがロードされる前。(ドキュメントを参照してください。)

これは何をしますか?NOOPのようです!(確認しましたが、実際には必要です。)

回答:


202

私は実際にこのコードを書きました。

サブドメイン/ポートのコメットを実行する場合、iframeのdocument.domain値は親フレームと同じである必要があります。残念ながら、ブラウザーはドメイン名とポートを元のdocument.domain値のために内部的に保存します。しかし、JavaScriptのゲッターとセッターはポートについて何も知りません。だから問題はこれです:上のフレームdocument.domain('example.com', 80)で、下のフレームがである('comet.example.com', 80)場合、どのようにして下のフレームも('example.com', 80)同じようになりますか?

ホスト名の部分を変更すると必ずポートがに設定されるためnull、これを行うことはできません。できる限りのことは('example.com', null)、下部のフレームで行うことです。したがって、上部フレームもその値に設定する必要があり、設定document.domain=document.domainはそれだけを行います。これは、ブラウザでの内部表現を変更('example.com', 80)する('example.com', null)と、その後すべてがアップ一致すると、クロスポート/サブドメインフレーム通信工事。


残念ながら、このソリューションはうまくいきませんでした(詳細については、stackoverflow.com / questions / 7796767 / …を参照してください)。すべてのフレームに「document.domain = document.domain」を追加しても、Chromeの動作は変わりません。何か案は?
Stephen Gross

また、jsに遅延を設定すると、少なくとも両方のフレームで有効に見えるURLを取得できることがわかりました。ただし、1つのフレームから別のフレームにアクセスすることはできません。
スティーブングロス

6
MDNで奇妙な「非表示」ポートがどのように機能するかについての別の説明があります:developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
ああ、あなたはこの腹立たしいコードの犯人です。上記の行のおかげで、実行後(およびdocument.domainセット)、動的に作成されたiframeはクロスドメインとして設定されるため、新しく作成されたiframeにアクセスできなくなります。:/
13

@mjs yes:ポート番号はブラウザによって個別に保持されます。document.domain = document.domainを含め、セッターを呼び出すと、ポート番号がnullで上書きされます。したがって、最初にdocument.domain = "company.com"を設定するだけでは、company.com:8080をcompany.comと通信させることができません。ポート番号が両方ともnullになるように両方に設定する必要があります。
Royi Namir 2013

38

ブラウザは、(a)明示的に設定されていない場合のdocument.domainと(b)明示的に設定されている場合のdocument.domain ...を区別します。

値を明示的に設定すると、(同じ親ドメインの下にある)別のサブドメイン上のスクリプトと「連携」する意図を示します。

親ページと外部スクリプトの両方が明示的にdocument.domainを同じ値に設定した場合、同じ生成元のポリシー制限がバイパスされ、各スクリプトが他のすべての(そうでない場合は制限されている)オブジェクトと他のコンテキストのプロパティにアクセスできます。


9

このサイトで次の情報を見つけました:devguru。より具体的には、ここに引用があります:

このプロパティは、ドキュメントが作成されたサーバーのドメイン名を設定または返します。デフォルトでは、ドキュメントが取得されたサーバーのドメイン名になりますが、この名前のサフィックス(およびサフィックスのみ)に変更できます。これにより、異なるサーバーから配信されたドキュメント間で、同じドメインサフィックスを共有する場合に、スクリプトプロパティの共有、セキュリティの許可が可能になります。

(サブドメインが異なる場合でも)同じドメインのクロスサイトスクリプティングを許可しているように思えます。

document.domainに触れない場合、jsエンジンは同じドメインの他のJavaScriptのみを許可すると思います。このプロパティを使用すると、オービットされたドキュメントの状態などの他のサブドメインにデプロイできます。


6
これはなぜdocument.domain = document.domainがNOOPではないかを説明するものではありません
クレセントフレッシュ

1
単なるワイルドな推測ですが、私が言ったように、プロパティが値に設定されたときにのみプロパティがトリガーされると思います。
ミゲルPingの

6

document.domain明示的に設定されていない場合は、実際のURLからデフォルトを引っ張ります。ブラウザはdocument.domain、URLがデフォルトであるか、明示的に設定されているかを記録します。これが機能するには、両方が同じドメインのデフォルトであるか、両方が明示的に同じドメインに設定されている必要があります。1つがデフォルトで、1つが明示的に設定され、両方が読み取られた場合に一致する場合でも、2つのページが互いに対話することは禁止されます。

参照:https : //developer.mozilla.org/en-US/docs/DOM/document.domain

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.