Document: domain プロパティ
非推奨;: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。
domain
は Document
インターフェイスのプロパティは、同一オリジンポリシーで使用される現在の文書のオリジンのうち、ドメインの部分を取得または設定します。
値
文字列です。
例外
SecurityError
DOMException
-
この機能の使用が権限ポリシーによってブロックされた。
例
ドメイン名の取得
https://developer.mozilla.org/ja/docs/Web
の URI において、この例は currentDomain
に "developer.mozilla.org
" の文字列を設定します。
const currentDomain = document.domain;
このプロパティのゲッターは、現在の文書のオリジンのドメイン部分を返します。ほとんどの場合、これは文書の URL のホスト名部分になります。しかし、いくつかの例外があります:
ゲッターはセッターと同じ方法で危険ではありませんが、代わりに Location.hostname
プロパティを使用する方がシンプルで有益な場合があります。
そうすれば、document.domain
を完全に避けることができます。
const currentHostname = location.hostname;
URL https://developer.mozilla.org/ja/docs/Web
の場合、currentHostname
は文字列 "developer.mozilla.org
" でもあります。
他にも、ポート番号が入る Location.host
や、完全なオリジンを提供する Window.origin
があります。
ドメインの設定
document.domain = domainString;
このプロパティのセッターは、ページのオリジンを変更するために使用することができます。設定するには、同じドメインか親ドメインを指定します。例えば、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
を使用する代わりに、Window.postMessage
を使用して非同期メッセージを他のオリジンに送信しましょう。このメッセージパッシングによる制御されたアクセスは、document.domain
によってすべてのデータが一律に公開されるよりもはるかに安全です。
失敗
セッターは、いくつかのケースで "SecurityError
" DOMException
が発生します。
document-domain
Permissions-Policy
が無効な場合- 文書がサンドボックス化された
<iframe>
の中にある場合。 - 文書に閲覧コンテキストがない場合。
- この文書の実効ドメインが
null
であった場合。 - 指定された値がページの現在のホスト名と同じでも、その親ドメインでもなかった場合。
この最後の失敗の例としては、https://example.com/
のときに document.domain
を "example.org"
に設定しようとすると発生します。
さらに、非推奨ですが、現行の分離機能と組み合わせても何もしません。
- オリジン間分離ページ、つまり
Cross-Origin-Opener-Policy
とCross-Origin-Embedder-Policy
に適切な値を使用しているページで用いる場合。HTTP ヘッダー - オリジン分離されたページ、すなわち HTTP の
Origin-Isolation
ヘッダーを使用しているページで用いる場合。
最後に、document.domain
を設定しても、いくつかの Web API がオリジンチェックに用いるオリジンは変更されないので、このメカニズムによるサブドメインからのアクセスを防ぐことができます。
関連する API には、Window.localStorage
、IndexedDB_API
、BroadcastChannel
、SharedWorker
があります(これらに限定されるものではありません)。
仕様書
Specification |
---|
HTML Standard # relaxing-the-same-origin-restriction |
ブラウザーの互換性
BCD tables only load in the browser