SOPをテストしているときに、このシナリオに到達しました。2つのドキュメントが同じドメインとの関係を持っているため、場所を取得しようとするとエラーが発生します。
問題を再現するには:
let opened = window.open("https://www.google.com")
opened.location.toString()
を実行すると、正しい場所が返されますdocument.domain = "www.google.com"
_を実行します最初のタブからopened.location.toString()
を実行すると、エラーが発生します
_Uncaught DOMException: Blocked a frame with Origin "https://www.google.com" from accessing a cross-Origin frame.
at <anonymous>:1:12
_
誰かがこの奇妙な行動を説明できますか?
このエラーはバグではありません。 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の 同じオリジンポリシーに関するガイド から抽出された情報
まず、お勧めします Same-Origin Policy をお読みください。
Same-Originポリシーは、あるOriginからロードされたドキュメントまたはスクリプトが別のOriginのリソースと対話する方法を制限する重要なセキュリティメカニズムです。悪意のある可能性のあるドキュメントを分離して、攻撃経路を減らすことができます。
protocol、ポート(指定されている場合)、およびホストが両方とも同じ場合、2つのURLは同じオリジンを持ちます。これは、「スキーム/ホスト/ポートタプル」または単に「タプル」として参照される場合があります。 (「タプル」は、全体を構成するアイテムのセットです。2倍、3倍、4倍、5倍などの一般的な形式です。)
この特定のケースでは、[〜#〜] https [〜#〜]プロトコル、ただしドメインを設定すると、プロトコルは[〜#〜] http [〜#〜]、下の画像を参照:
1 のとおり、プロトコルが同じでない場合は、原則に違反しているため、エラーが発生します
キャッチされなかったDOMException:Origin " https://www.google.com "でフレームがcross-Originにアクセスするのをブロックしましたフレーム。
cross-Originはここのキーワードです。
また、詳細については、この SecurityError:Origined with a frame with Origin from cross-Origin frame を確認してください。
それにもかかわらず、これは少し有益ではありません(事実を述べているだけです)。
ウィンドウBでdomain
を変更すると、ウィンドウBはウィンドウAのopener
としてのアカウンティングを停止します。
ウィンドウAはウィンドウBのオープナーと見なされなくなったため、アクセスは禁止されています。
これにより、document.domain
は安全でない可能性があると見なされ、子ウィンドウを孤立させることで「処罰」されます。