最近のウェブアプリでは、異なるオリジン間の安全な通信を可能にするためにwindow.postMessage()
メソッドが一般的に使用されています。ただし、適切に管理されていない場合、このメソッドを使用すると意図しない動作が発生する可能性があります。
問題
Pendoエージェントは、異なるオリジン間の通信にpostMessage
イベントを使用します。アプリでもpostMessage
イベントを使用しているにもかかわらず、Pendoが生成するpostMessage
イベントとアプリが生成する同イベントを適切に区別していない場合、Pendoエージェントからの意図しないpostMessage
イベントが処理されるリスクがあります。
アプリケーションがPendoからのPostMessage
イベントには存在しない特定の形式またはデータセットを想定している可能性があるため、これにより予期しないPOSTリクエストエラーが発生する可能性があります。
解決策
このソリューションは、アプリケーションを保護するためのアプローチの一例です。メッセージの発信元と内容に応じて、postMessage
リスナー内に個別の処理ロジックを実装することを検討してください。
-
メッセージにユニークなトークンを含める。アプリケーションの送信部分を変更して、
customerNamespace:MessageName
などの値を持つ一意のtype
フィールドを含めます。 -
受信メッセージを検証する。メッセージイベントリスナーを更新して、メッセージを処理する前に、この一意の
type
フィールドの存在と値を確認します。さらに、送信元と送信先が予想される送信者と一致していることを確認します。
実装例を以下に示します。
// Sending a message
window.postMessage({ type: 'customerNamespace:MessageName', data: yourData }, 'https://your-app.com');
// Listening for messages
window.addEventListener('message', function(event) {
// Check the origin of the message
if (event.origin !== 'https://your-app.com') return;
// Check the type of the message
if (event.data.type && event.data.type.startsWith('customerNamespace:')) {
// Process the message
handleMessage(event.data);
}
});
function handleMessage(data) {
// Your custom message handling logic
}
この記事では基本的な検証方法を説明していますが、アプリケーションの特定のニーズとセキュリティ要件に合わせてセキュリティ対策を調整することが重要です。