iframeのクロスドメインパススルーを解決する(オリジン付きフレームをブロックする)
2022-02-08 02:04:31
I. 問題の説明
iframeを使用してiframeの子ページを経由して親ページを呼び出したり、親ページからiframeの子ページを呼び出す場合、ブラウザのセキュリティポリシー違反によりiframeを越えて相手ページのデータを取得できず、コンソールで以下のエラーが表示されることがあります。
オリジン "http://localhost:****" を持つフレームが、クロスオリジンフレームにアクセスするのをブロックしました。
II. ソリューション
上記の問題を解決するには
postMessage
メソッドを使用することで、iframe をまたいだ安全な通信を行うことができます。
1. iframeの子ページが親ページを呼び出す
- 子ページデータ送信
// data is the data sent by the subpage (it can be a js object, which will be automatically serialized and processed)
window.parent.postMessage(data, '*')
- 親ページデータリスナー
addEventListener('message', e => {
// e.data is the data sent by the child page
console.log(e.data)
})
2. 親ページがiframeの子ページを呼び出す
- 親ページのデータ送信
document.getElementById('iframe').contentWindow.postMessage(data,'*')
- サブページがデータを受け取る
addEventListener('message', e => {
// e.data is the data sent by the parent page
console.log(e.data)
})
3. セキュリティの最適化 - 受信元を制限するデータの送信
上記のコードにおいて
postMessage
には、以下のコード例のように、受信ソースを指定できる任意のソースを意味する「*」が設定されています。
window.parent.postMessage('exit','http://example.org');
- 送信元を検出するためのデータのリスニング
addEventListener('message', e => {
if(e.origin === 'http://example.org') {
// Only perform the corresponding action if the data is sent from a trusted address
}
})
終了
関連
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み] TypeError: Cannot Set property 'onclick' of null
-
[解決済み] htmlのdata-reactid属性とは何ですか?
-
[解決済み] クエリとは何ですか。url.parse()でnodeJSを使用して、[Object: null prototype]を指定しています。
-
[解決済み] res.sendFile は関数ではありません Node.js
-
[解決済み] Javascriptのエラーです。IPython は JupyterLab で定義されていません。
-
[解決済み] MalformedXMLです。提供されたXMLは整形式でないか、公開されたスキーマに照らして検証されていません。
-
[解決済み] toFixed()関数が動作しないのはなぜですか?
-
[解決済み] 配列の結合時に未定義のプロパティ「push」を読み込むことができない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み] await は非同期関数でのみ有効です。
-
[解決済み] DeprecationWarning: コールバックのない非同期関数の呼び出しは非推奨です。- function:」がどこにあるか見つけるには?
-
[解決済み] 自己要素の削除 onclick
-
[解決済み] SyntaxError: JSON.parse: JSONの1行目2列目に予期せぬ文字があります。
-
[解決済み] Uncaught TypeError: Cannot create property 'guid' on string ' [duplicate] (文字列のプロパティ 'guid'を作成できない)。
-
[解決済み] TypeError: undefined はコンストラクタではありません。
-
[解決済み] select onChange がフォーム内で動作しない
-
[解決済み] Gulp Watchが動作しない
-
JSLint を使用して Javascript をチェックすると、parseInt が Warning を報告します。基数パラメータがありません