Orbited (Comet サーバー)のクライアント側 JS コンポーネントでは、サーバーが JS 自体とは異なるドメインまたはポートで実行されている場合、次を実行する必要があります。
document.domain = document.domain;
他の JS がロードされる前。(ドキュメントを参照してください。)
これは何をしますか?NOOPみたい!(調べたところ、実際に必要です。)
私は実際にこのコードを書きました。
クロスサブドメイン/ポートコメットを実行しようとする場合、iframedocument.domain
は親フレームと同じ値である必要があります。残念ながら、ブラウザは元の値のドメイン名とポートを内部に保存しdocument.domain
ます。しかし、javascriptのgetterとsetterは、ポートについて何も知りません。したがって、問題はこれです。上のフレーム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)
と、すべてが一致し、クロスポート/サブドメインフレーム通信が機能します。
ブラウザーは、(a) 明示的に設定されていない場合の document.domain と (b) 明示的に設定されている場合の document.domain を区別します ... 同じ値を返す場合でも。
値を明示的に設定することは、別のサブドメイン (同じ親ドメインの下) のスクリプトと「協力」する意図を示します。
親ページと外部スクリプトの両方が明示的に document.domain を同じ値に設定した場合、同じ生成元ポリシーの制限がバイパスされ、各スクリプトが互いのコンテキストのすべての (そうでなければ制限されている) オブジェクトとプロパティにアクセスする可能性があります。
このサイトで次の情報を見つけました: devguru。より具体的には、ここに引用があります:
このプロパティは、ドキュメントが作成されたサーバーのドメイン名を設定または返します。これは、ドキュメントが取得されたサーバーのドメイン名にデフォルト設定されますが、この名前のサフィックス (およびサフィックスのみ) に変更できます。これにより、異なるサーバーから配信されたドキュメントが同じドメイン サフィックスを共有していれば、スクリプト プロパティの共有が可能になり、セキュリティが可能になります。
同じドメインのクロスサイトスクリプティングが許可されているようです(サブドメインが異なっていても)。
document.domain に触れなければ、js エンジンは同じドメインからの他の JavaScript のみを許可すると思います。そのプロパティを使用すると、orbited docs state のような他のサブドメインにデプロイできます。
document.domain
明示的に設定されていない場合、実際の URL からデフォルトが取得されます。ブラウザはdocument.domain
、URL からデフォルトとして来ているか、明示的に設定されているかを記録します。これが機能するには、両方が同じドメインのデフォルトであるか、両方が明示的に同じドメインに設定されている必要があります。1 つがデフォルトで、1 つが明示的に設定されている場合、読み取り時に両方が一致する場合でも、2 つのページは相互に対話することを禁止されます。
参照: https://developer.mozilla.org/en-US/docs/DOM/document.domain