CodeQL 文档

不完整的 URL 方案检查

ID: js/incomplete-url-scheme-check
Kind: problem
Security severity: 7.8
Severity: warning
Precision: high
Tags:
   - security
   - correctness
   - external/cwe/cwe-020
   - external/cwe/cwe-184
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

以 `javascript:` 开头的 URL 可用于编码 JavaScript 代码,并在访问该 URL 时执行。虽然这是一种创建功能丰富且响应迅速的 Web 应用程序的强大机制,但也存在潜在的安全风险:如果 URL 来自不可信来源,它可能包含有害的 JavaScript 代码。因此,许多框架和库会首先检查任何不可信 URL 的 URL 方案,并拒绝以 `javascript:` 方案开头的 URL。

但是,`data:` 和 `vbscript:` 方案可以以非常类似的方式用于表示可执行代码,因此任何只针对 `javascript:` 而未针对 `data:` 和 `vbscript:` 进行验证的逻辑可能都不够充分。

建议

添加涵盖 `data:` 和 `vbscript:` 的检查。

示例

以下函数验证(可能不可信)URL `url`。如果它以 `javascript:` 开头(不区分大小写,可能在前面有空格),则返回无害的占位符 URL `about:blank` 以防止代码注入;否则返回 `url` 本身。

function sanitizeUrl(url) {
    let u = decodeURI(url).trim().toLowerCase();
    if (u.startsWith("javascript:"))
        return "about:blank";
    return url;
}

虽然此检查提供了部分保护,但应扩展以涵盖 `data:` 和 `vbscript:`。

function sanitizeUrl(url) {
    let u = decodeURI(url).trim().toLowerCase();
    if (u.startsWith("javascript:") || u.startsWith("data:") || u.startsWith("vbscript:"))
        return "about:blank";
    return url;
}

参考资料

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