web-dev-qa-db-ja.com

JavaScript document.domain Uncaught DOMException:origin with a frame with block

SOPをテストしているときに、このシナリオに到達しました。2つのドキュメントが同じドメインとの関係を持っているため、場所を取得しようとするとエラーが発生します。

問題を再現するには:

  1. 開く https://www.google.com
  2. コンソールからlet opened = window.open("https://www.google.com")
  3. 同じウィンドウからopened.location.toString()を実行すると、正しい場所が返されます
  4. 2番目のタブのコンソールから_document.domain = "www.google.com"_を実行します
  5. 最初のタブからopened.location.toString()を実行すると、エラーが発生します

    _Uncaught DOMException: Blocked a frame with Origin "https://www.google.com" from accessing a cross-Origin frame.
    at <anonymous>:1:12
    _

誰かがこの奇妙な行動を説明できますか?

8
as77c

このエラーはバグではありません。 same-Originポリシーは、ウィンドウオブジェクトが取得を許可された情報にのみアクセスできるようにするセキュリティメカニズムです。あなたの場合、これにはopened.locationへのアクセス権が含まれます。

作成時、両方のタブには同じオリジンがあり、最初のタブからopened.locationにアクセスできます。しかし、document.domain='www.google.com'への呼び出しの後、それらはもうありません。

「何ですか?しかし、両方のタブで、window.location.Originは同じです」

はい、しかしそれはもう少し複雑です。 Originは、scheme/Host/port Tupleによって定義されます。詳細については、@ TheUnknownの回答を参照してください。スキームとホストはずっと同じままで、window.location.Originの文字列に含まれています。

注意が必要なのは、document.domainを含むdocument.domain = document.domainを呼び出すと、ポート番号がnullで上書きされるため、 2つのタブの起源、およびそれらがopened.locationなどの情報を互いに通信できないようにすることで、エラーが発生します。

MDNの 同じオリジンポリシーに関するガイド から抽出された情報

4
Nino Filiu

まず、お勧めします Same-Origin Policy をお読みください。

Same-Originポリシーは、あるOriginからロードされたドキュメントまたはスクリプトが別のOriginのリソースと対話する方法を制限する重要なセキュリティメカニズムです。悪意のある可能性のあるドキュメントを分離して、攻撃経路を減らすことができます。

protocol、ポート(指定されている場合)、およびホストが両方とも同じ場合、2つのURLは同じオリジンを持ちます。これは、「スキーム/ホスト/ポートタプル」または単に「タプル」として参照される場合があります。 (「タプル」は、全体を構成するアイテムのセットです。2倍、3倍、4倍、5倍などの一般的な形式です。)

この特定のケースでは、[〜#〜] https [〜#〜]プロトコル、ただしドメインを設定すると、プロトコルは[〜#〜] http [〜#〜]、下の画像を参照:

protocol has changed

1 のとおり、プロトコルが同じでない場合は、原則に違反しているため、エラーが発生します

キャッチされなかったDOMException:Origin " https://www.google.com "でフレームがcross-Originにアクセスするのをブロックしましたフレーム。

cross-Originはここのキーワードです。

また、詳細については、この SecurityError:Origined with a frame with Origin from cross-Origin frame を確認してください。

3

それにもかかわらず、これは少し有益ではありません(事実を述べているだけです)。

  • ウィンドウBでdomainを変更すると、ウィンドウBはウィンドウAのopenerとしてのアカウンティングを停止します。

  • ウィンドウAはウィンドウBのオープナーと見なされなくなったため、アクセスは禁止されています。

これにより、document.domainは安全でない可能性があると見なされ、子ウィンドウを孤立させることで「処罰」されます。

0
haldagan