主机名正则表达式不完整¶
ID: js/incomplete-hostname-regexp
Kind: problem
Security severity: 7.8
Severity: warning
Precision: high
Tags:
- correctness
- security
- external/cwe/cwe-020
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
清理不受信任的 URL 是防止攻击(如请求伪造和恶意重定向)的重要技术。通常,这是通过检查 URL 的主机是否在允许的主机集中来完成的。
如果正则表达式实现了这种检查,则很容易在构建正则表达式时意外地使检查过于宽松,因为没有正确地转义 .
元字符。即使检查不用于安全关键的环境,不完整的检查在意外成功时仍然会导致不良行为。
建议¶
在构建用于安全检查的正则表达式时,请适当地转义所有元字符,并特别注意 .
元字符。
示例¶
以下示例代码检查 URL 重定向是否将到达 example.com
域或其子域之一。
app.get('/some/path', function(req, res) {
let url = req.param('url'),
host = urlLib.parse(url).host;
// BAD: the host of `url` may be controlled by an attacker
let regex = /^((www|beta).)?example.com/;
if (host.match(regex)) {
res.redirect(url);
}
});
但是,由于未转义的 .
允许 example.com
之前的任何字符,因此该检查很容易绕过,从而允许重定向到攻击者控制的域,例如 wwwXexample.com
。
通过适当地转义 .
来解决此漏洞:let regex = /^((www|beta)\.)?example\.com/
。
参考¶
MDN: 正则表达式
OWASP: SSRF
OWASP: XSS 未验证的重定向和转发备忘单.
常见弱点枚举: CWE-20.