1.5 敏感数据保护

1.5.1【必须】敏感信息访问

  • 禁止将敏感信息硬编码在程序中,既可能会将敏感信息暴露给攻击者,也会增加代码管理和维护的难度
  • 使用配置中心系统统一托管密钥等敏感信息

1.5.2【必须】敏感数据输出

  • 只输出必要的最小数据集,避免多余字段暴露引起敏感信息泄露
  • 不能在日志保存密码(包括明文密码和密文密码)、密钥和其它敏感信息
  • 对于必须输出的敏感信息,必须进行合理脱敏展示
  1. // bad
  2. func serve() {
  3. http.HandleFunc("/register", func(w http.ResponseWriter, r *http.Request) {
  4. r.ParseForm()
  5. user := r.Form.Get("user")
  6. pw := r.Form.Get("password")
  7. log.Printf("Registering new user %s with password %s.\n", user, pw)
  8. })
  9. http.ListenAndServe(":80", nil)
  10. }
  11. // good
  12. func serve1() {
  13. http.HandleFunc("/register", func(w http.ResponseWriter, r *http.Request) {
  14. r.ParseForm()
  15. user := r.Form.Get("user")
  16. pw := r.Form.Get("password")
  17. log.Printf("Registering new user %s.\n", user)
  18. // ...
  19. use(pw)
  20. })
  21. http.ListenAndServe(":80", nil)
  22. }
  • 避免通过GET方法、代码注释、自动填充、缓存等方式泄露敏感信息

1.5.3【必须】敏感数据存储

  • 敏感数据应使用SHA2、RSA等算法进行加密存储
  • 敏感数据应使用独立的存储层,并在访问层开启访问控制
  • 包含敏感信息的临时文件或缓存一旦不再需要应立刻删除

1.5.4【必须】异常处理和日志记录

  • 应合理使用panic、recover、defer处理系统异常,避免出错信息输出到前端
  1. defer func () {
  2. if r := recover(); r != nil {
  3. fmt.Println("Recovered in start()")
  4. }
  5. }()
  • 对外环境禁止开启debug模式,或将程序运行日志输出到前端

错误例子:

  1. dlv --listen=:2345 --headless=true --api-version=2 debug test.go

正确例子:

  1. dlv debug test.go