错误的重定向检查¶
ID: go/bad-redirect-check
Kind: path-problem
Security severity: 6.1
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-601
Query suites:
- go-code-scanning.qls
- go-security-extended.qls
- go-security-and-quality.qls
应检查重定向 URL,以确保用户输入不会导致网站重定向到任意域。这通常是通过检查重定向 URL 是否以斜杠开头来完成的,大多数情况下,斜杠是同一主机上的绝对重定向。但是,浏览器将以 //
或 /\
开头的 URL 解释为绝对 URL。例如,重定向到 //example.com
将重定向到 https://example.com
。因此,重定向检查还必须检查重定向 URL 的第二个字符。
建议¶
也不允许以 //
或 /\
开头的重定向 URL。
示例¶
以下函数验证(可能是不可信的)重定向 URL redir
。如果它不是以 /
开头,则返回无害的占位符重定向 URL /
以防止开放重定向;否则返回 redir
本身。
package main
func sanitizeUrl(redir string) string {
if len(redir) > 0 && redir[0] == '/' {
return redir
}
return "/"
}
虽然此检查提供部分保护,但应将其扩展到也涵盖 //
和 /\
。
package main
func sanitizeUrl1(redir string) string {
if len(redir) > 1 && redir[0] == '/' && redir[1] != '/' && redir[1] != '\\' {
return redir
}
return "/"
}
参考¶
OWASP: XSS 未经验证的重定向和转发备忘单。
通用弱点列举:CWE-601。