CodeQL 文档

postMessage 处理程序中缺少来源验证

ID: js/missing-origin-check
Kind: problem
Security severity: 5
Severity: warning
Precision: medium
Tags:
   - correctness
   - security
   - external/cwe/cwe-020
   - external/cwe/cwe-940
Query suites:
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

"message" 事件用于在窗口之间发送消息。不受信任的窗口可以向受信任的窗口发送消息,接收方需要验证消息的合法性。执行此验证的一种方法是检查消息的 origin,以确保它来自受信任的窗口。

建议

始终验证传入消息的来源。

示例

以下示例使用收到的消息来执行一些代码。但是,没有检查消息的来源,因此攻击者可能可以执行任意代码。

function postMessageHandler(event) {
    let origin = event.origin.toLowerCase();

    console.log(origin)
    // BAD: the origin property is not checked
    eval(event.data);
}

window.addEventListener('message', postMessageHandler, false);

下面的示例已修复,其中检查了来源是否受信任。因此,恶意用户无法使用不受信任的来源执行攻击。

function postMessageHandler(event) {
    console.log(event.origin)
    // GOOD: the origin property is checked
    if (event.origin === 'https://www.example.com') {
        // do something
    }
}

window.addEventListener('message', postMessageHandler, false);

参考文献

  • ©GitHub, Inc.
  • 条款
  • 隐私