1.5 敏感数据保护
1.5.1【必须】敏感信息访问
- 禁止将敏感信息硬编码在程序中,既可能会将敏感信息暴露给攻击者,也会增加代码管理和维护的难度
- 使用配置中心系统统一托管密钥等敏感信息
1.5.2【必须】敏感数据输出
- 只输出必要的最小数据集,避免多余字段暴露引起敏感信息泄露
- 不能在日志保存密码(包括明文密码和密文密码)、密钥和其它敏感信息
- 对于必须输出的敏感信息,必须进行合理脱敏展示
// bad
func serve() {
http.HandleFunc("/register", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
user := r.Form.Get("user")
pw := r.Form.Get("password")
log.Printf("Registering new user %s with password %s.\n", user, pw)
})
http.ListenAndServe(":80", nil)
}
// good
func serve1() {
http.HandleFunc("/register", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
user := r.Form.Get("user")
pw := r.Form.Get("password")
log.Printf("Registering new user %s.\n", user)
// ...
use(pw)
})
http.ListenAndServe(":80", nil)
}
- 避免通过GET方法、代码注释、自动填充、缓存等方式泄露敏感信息
1.5.3【必须】敏感数据存储
- 敏感数据应使用SHA2、RSA等算法进行加密存储
- 敏感数据应使用独立的存储层,并在访问层开启访问控制
- 包含敏感信息的临时文件或缓存一旦不再需要应立刻删除
1.5.4【必须】异常处理和日志记录
- 应合理使用panic、recover、defer处理系统异常,避免出错信息输出到前端
defer func () {
if r := recover(); r != nil {
fmt.Println("Recovered in start()")
}
}()
- 对外环境禁止开启debug模式,或将程序运行日志输出到前端
错误例子:
dlv --listen=:2345 --headless=true --api-version=2 debug test.go
正确例子:
dlv debug test.go