URL 方案检查不完整¶
ID: go/incomplete-url-scheme-check
Kind: problem
Security severity: 7.8
Severity: warning
Precision: high
Tags:
- security
- correctness
- external/cwe/cwe-020
Query suites:
- go-code-scanning.qls
- go-security-extended.qls
- go-security-and-quality.qls
具有特殊方案 javascript 的 URL 可用于编码 JavaScript 代码,以便在访问 URL 时执行。虽然这是创建功能丰富且响应迅速的 Web 应用程序的强大机制,但它也存在潜在的安全风险:如果 URL 来自不受信任的来源,则它可能包含有害的 JavaScript 代码。因此,许多框架和库首先检查任何不受信任 URL 的 URL 方案,并拒绝使用 javascript 方案的 URL。
但是,data 和 vbscript 方案可以非常类似的方式表示可执行代码,因此任何针对 javascript 进行检查但不针对 data 和 vbscript 进行检查的验证逻辑都可能不够充分。
建议¶
添加涵盖 data: 和 vbscript: 的检查。
示例¶
以下函数验证(可能是不可信的)URL urlstr。如果其方案为 javascript,则返回无害的占位符 URL about:blank 以防止代码注入;否则返回 urlstr 本身。
package main
import "net/url"
func sanitizeUrl(urlstr string) string {
u, err := url.Parse(urlstr)
if err != nil || u.Scheme == "javascript" {
return "about:blank"
}
return urlstr
}
虽然此检查提供部分保护,但应将其扩展到涵盖 data 和 vbscript。
package main
import "net/url"
func sanitizeUrlGod(urlstr string) string {
u, err := url.Parse(urlstr)
if err != nil || u.Scheme == "javascript" || u.Scheme == "data" || u.Scheme == "vbscript" {
return "about:blank"
}
return urlstr
}