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
}