JavaScript Tips | セキュリティ:postMessageのOriginを検証する

JavaScript JavaScript
スポンサーリンク
スポンサーリンク
  1. postMessageのOrigin検証は「別ドメインとのメッセージ通信を“信頼できる相手だけ”に限定するための防御技術」です
  2. postMessageの基本動作を理解する(まずはイメージから)
    1. 親ページから iframe へメッセージを送る例
  3. なぜOrigin検証が必要なのか(危険なパターンを知る)
    1. 危険な受信側コードの例
  4. ステップ1:受信側で必ず event.origin を確認する
  5. ステップ2:許可するOriginをホワイトリストで管理する(最重要)
    1. 使用例
  6. ステップ3:メッセージの「型」も検証する(Originだけでは不十分)
    1. 型検証の基本
    2. 使用例
  7. ステップ4:メッセージ処理を分離したハンドラ関数を作る
  8. ステップ5:業務で使える「postMessage Origin検証ユーティリティ」(まとめ版)
    1. 使用例
  9. ステップ6:送信側でもOriginを意識する(targetOrigin を正しく指定する)
    1. 危険な書き方("*" を使う)
    2. 安全な書き方
  10. ステップ7:実務でのテンプレート例
    1. 親ページと iframe 間の安全なメッセージ通信
    2. 別タブとの通信
  11. 深掘り:なぜ「postMessageのOrigin検証」がここまで重要なのか
    1. 1. postMessageは「オリジンを超えた強力な通信手段」
    2. 2. 攻撃者は「正規の親ページのふり」をしてメッセージを送れる
    3. 3. セキュリティポリシーをコードで明文化できる
    4. 4. iframe連携・外部サービス連携で必須の技術
  12. まとめ:postMessageのOrigin検証は「別ドメインとの会話を安全にするための必須ガード」

postMessageのOrigin検証は「別ドメインとのメッセージ通信を“信頼できる相手だけ”に限定するための防御技術」です

window.postMessage は、

  • 親ページと <iframe>
  • 別タブ・別ウィンドウ
  • 異なるドメイン同士

といった「オリジンの違うページ間」でメッセージをやり取りするための仕組みです。

とても便利な一方で、 「誰から来たメッセージなのか」をきちんと確認しないと、 攻撃者からのメッセージを“正規の指示”として受け入れてしまう危険があります。

そこで重要になるのが、 postMessageorigin を検証する JavaScriptユーティリティです。

ここでは、初心者向けに、 postMessage の基本 → 何が危険か → Origin検証のやり方 → 業務で使えるテンプレート という流れでステップバイステップで解説していきます。

postMessageの基本動作を理解する(まずはイメージから)

親ページから iframe へメッセージを送る例

親ページ側:

const iframe = document.getElementById("child-frame");
iframe.contentWindow.postMessage(
  { type: "SET_THEME", theme: "dark" },
  "https://child.example.com"
);
JavaScript

iframe側:

window.addEventListener("message", (event) => {
  console.log("受信したメッセージ:", event.data);
});
JavaScript

ここで重要なのは、 postMessage の第2引数に 送信先のオリジン(スキーム+ホスト+ポート) を指定している点です。

例:"https://child.example.com"

なぜOrigin検証が必要なのか(危険なパターンを知る)

危険な受信側コードの例

window.addEventListener("message", (event) => {
  // Originを一切確認していない
  if (event.data.type === "SET_THEME") {
    applyTheme(event.data.theme); // どこから来たか分からない指示を実行
  }
});
JavaScript

このコードは、 「どのサイトから送られてきたメッセージでも受け入れてしまう」 状態になっています。

攻撃者が次のようなページを用意し、 ユーザーに開かせるだけで攻撃が成立します。

// 攻撃者のページ
const targetWindow = window.opener || window.parent;
targetWindow.postMessage(
  { type: "SET_THEME", theme: "evil" },
  "*"
);
JavaScript

受信側がOriginを確認していないと、 このメッセージも「正規の指示」として扱われてしまいます。

タイトルとURLをコピーしました