不完整的 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
以 `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;
}