Document: domain プロパティ

非推奨: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。

domainDocument インターフェイスのプロパティは、同一オリジンポリシーで使用される現在の文書のオリジンのうち、ドメインの部分を取得または設定します。

文字列です。

例外

SecurityError DOMException

この機能の使用が権限ポリシーによってブロックされた。

ドメイン名の取得

https://developer.mozilla.org/ja/docs/Web の URI において、この例は currentDomain に "developer.mozilla.org" の文字列を設定します。

js
const currentDomain = document.domain;

このプロパティのゲッターは、現在の文書のオリジンのドメイン部分を返します。ほとんどの場合、これは文書の URL のホスト名部分になります。しかし、いくつかの例外があります:

  • 例えば、データ URL を持つページのように、そのページに不透明なオリジンがある場合は、空文字列を返します。
  • もし document.domain セッターが使用されていれば、設定した値を返します。

ゲッターはセッターと同じ方法で危険ではありませんが、代わりに Location.hostname プロパティを使用する方がシンプルで有益な場合があります。 そうすれば、document.domainを完全に避けることができます。

js
const currentHostname = location.hostname;

URL https://developer.mozilla.org/ja/docs/Web の場合、currentHostname は文字列 "developer.mozilla.org" でもあります。 他にも、ポート番号が入る Location.host や、完全なオリジンを提供する Window.origin があります。

ドメインの設定

js
document.domain = domainString;

このプロパティのセッターは、ページのオリジンを変更するために使用することができます。設定するには、同じドメインか親ドメインを指定します。例えば、https://a.example.comhttps://b.example.com の両方が使用する場合、

js
document.domain = "example.com";

を指定された場合、どちらも同じドメインを持つようにオリジンを変更したことになり、別なオリジンであるにもかかわらず、お互いの DOM に直接アクセスすることができます。

document.domain を現在の値に設定しても、何もしないわけではないことに注意してください。それでも元は変わります。例えば、あるページで

js
document.domain = document.domain;

と同じことをしていなければ、同じことをしていない他のページからのクロスオリジンとしてカウントされます。

非推奨

document.domain セッターは非推奨です。これは同一オリジンポリシーによって指定されたセキュリティ保護を損ない、ブラウザーにおけるオリジンモデルを複雑にし、相互運用性の問題やセキュリティバグを引き起こします。

document.domain を設定しようとするのは危険です。すべてのサブドメインからページの DOM にフルアクセスすることができるようになり、意図したものではありません。また、元からポートの部品が除去されるので、これであなたのページは同じIPアドレスや同じホストの部品を持つ他のページから、異なるポートであってもアクセスすることができるようになります。

これは共有ホストでは特に安全ではありません。例えば、他の共有ホスティングの顧客が同じ IP アドレスで別のポートでサイトをホストすることができる場合、document.domain を設定すると、通常は他の顧客のサイトがあなたのサイトのデータにアクセスしないように保護する同一生成元保護が除去されます。

同様の問題は、各顧客に異なるサブドメインを与える共有ホスティングサイトでも発生します。サイトが document.domain を設定すると、別のサブドメインにいる他の顧客も同じことをすることができ、元のサイトのデータにアクセスし始めることができます。

オリジン間の通信を容易にするために document.domain を使用する代わりに、Window.postMessage を使用して非同期メッセージを他のオリジンに送信しましょう。このメッセージパッシングによる制御されたアクセスは、document.domain によってすべてのデータが一律に公開されるよりもはるかに安全です。

失敗

セッターは、いくつかのケースで "SecurityError" DOMException が発生します。

この最後の失敗の例としては、https://example.com/ のときに document.domain"example.org" に設定しようとすると発生します。

さらに、非推奨ですが、現行の分離機能と組み合わせても何もしません。

最後に、document.domain を設定しても、いくつかの Web API がオリジンチェックに用いるオリジンは変更されないので、このメカニズムによるサブドメインからのアクセスを防ぐことができます。 関連する API には、Window.localStorageIndexedDB_APIBroadcastChannelSharedWorker があります(これらに限定されるものではありません)。

仕様書

Specification
HTML Standard
# relaxing-the-same-origin-restriction

ブラウザーの互換性

BCD tables only load in the browser

関連情報