title | short-title | slug | l10n | ||
---|---|---|---|---|---|
Document: domain プロパティ |
domain |
Web/API/Document/domain |
|
{{ApiRef}} {{Deprecated_Header}}
domain
は {{domxref("Document")}} インターフェイスのプロパティは、同一オリジンポリシーで使用される現在の文書の{{glossary("origin", "オリジン")}}のうち、ドメインの部分を取得または設定します。
文字列です。
SecurityError
{{domxref("DOMException")}}- : この機能の使用が権限ポリシーによってブロックされた。
https://developer.mozilla.org/ja/docs/Web
の URI において、この例は currentDomain
に "developer.mozilla.org
" の文字列を設定します。
const currentDomain = document.domain;
このプロパティのゲッターは、現在の文書のオリジンのドメイン部分を返します。ほとんどの場合、これは文書の URL のホスト名部分になります。しかし、いくつかの例外があります:
- 例えば、データ URL を持つページのように、そのページに不透明な{{glossary("origin", "オリジン")}}がある場合は、空文字列を返します。
- もし
document.domain
セッターが使用されていれば、設定した値を返します。
ゲッターはセッターと同じ方法で危険ではありませんが、代わりに {{domxref("Location.hostname")}} プロパティを使用する方がシンプルで有益な場合があります。
そうすれば、document.domain
を完全に避けることができます。
const currentHostname = location.hostname;
URL https://developer.mozilla.org/ja/docs/Web
の場合、currentHostname
は文字列 "developer.mozilla.org
" でもあります。
他にも、ポート番号が入る {{domxref("Location.host")}} や、完全なオリジンを提供する {{domxref("Window.origin")}} があります。
document.domain = domainString;
このプロパティのセッターは、ページの{{glossary("origin","オリジン")}}を変更するために使用することができます。設定するには、同じドメインか親ドメインを指定します。例えば、https://a.example.com
と https://b.example.com
の両方が使用する場合、
document.domain = "example.com";
を指定された場合、どちらも同じドメインを持つようにオリジンを変更したことになり、別なオリジンであるにもかかわらず、お互いの DOM に直接アクセスすることができます。
document.domain
を現在の値に設定しても、何もしないわけではないことに注意してください。それでも元は変わります。例えば、あるページで
document.domain = document.domain;
と同じことをしていなければ、同じことをしていない他のページからのクロスオリジンとしてカウントされます。
document.domain
セッターは非推奨です。これは同一オリジンポリシーによって指定されたセキュリティ保護を損ない、ブラウザーにおけるオリジンモデルを複雑にし、相互運用性の問題やセキュリティバグを引き起こします。
document.domain
を設定しようとするのは危険です。すべてのサブドメインからページの DOM にフルアクセスすることができるようになり、意図したものではありません。また、元からポートの部品が除去されるので、これであなたのページは同じIPアドレスや同じホストの部品を持つ他のページから、異なるポートであってもアクセスすることができるようになります。
これは共有ホストでは特に安全ではありません。例えば、他の共有ホスティングの顧客が同じ IP アドレスで別のポートでサイトをホストすることができる場合、document.domain
を設定すると、通常は他の顧客のサイトがあなたのサイトのデータにアクセスしないように保護する同一生成元保護が除去されます。
同様の問題は、各顧客に異なるサブドメインを与える共有ホスティングサイトでも発生します。サイトが document.domain
を設定すると、別のサブドメインにいる他の顧客も同じことをすることができ、元のサイトのデータにアクセスし始めることができます。
オリジン間の通信を容易にするために document.domain
を使用する代わりに、{{domxref("Window.postMessage")}} を使用して非同期メッセージを他のオリジンに送信しましょう。このメッセージパッシングによる制御されたアクセスは、document.domain
によってすべてのデータが一律に公開されるよりもはるかに安全です。
セッターは、いくつかのケースで "SecurityError
" {{domxref("DOMException")}} が発生します。
- {{httpheader('Permissions-Policy/document-domain','document-domain')}} {{HTTPHeader("Permissions-Policy")}} が無効な場合
- 文書がサンドボックス化された {{htmlelement("iframe")}} の中にある場合。
- 文書に{{glossary("browsing context","閲覧コンテキスト")}}がない場合。
- この文書の実効ドメインが
null
であった場合。 - 指定された値がページの現在のホスト名と同じでも、その親ドメインでもなかった場合。
この最後の失敗の例としては、https://example.com/
のときに document.domain
を "example.org"
に設定しようとすると発生します。
さらに、非推奨ですが、現行の分離機能と組み合わせても何もしません。
- オリジン間分離ページ、つまり {{httpheader("Cross-Origin-Opener-Policy")}} と {{httpheader("Cross-Origin-Embedder-Policy")}} に適切な値を使用しているページで用いる場合。HTTP ヘッダー
- オリジン分離されたページ、すなわち HTTP の {{httpheader("Origin-Isolation")}} ヘッダーを使用しているページで用いる場合。
最後に、document.domain
を設定しても、いくつかの Web API がオリジンチェックに用いるオリジンは変更されないので、このメカニズムによるサブドメインからのアクセスを防ぐことができます。
関連する API には、{{domxref("Window.localStorage")}}、{{domxref("IndexedDB_API")}}、{{domxref("BroadcastChannel")}}、{{domxref("SharedWorker")}} があります(これらに限定されるものではありません)。
{{Specifications}}
{{Compat}}
- 同一オリジンポリシー
- {{domxref("Location.hostname")}}
- {{domxref("Location.host")}}
- {{domxref("Window.origin")}}