为了账号安全,请及时绑定邮箱和手机立即绑定

有条件地打印包含敏感数据的调试信息

有条件地打印包含敏感数据的调试信息

Go
守着一只汪 2022-09-26 19:54:58
我正在运行一个Go程序作为工作。k8s应用程序向集群发送 API 请求以创建用户,因此它将包含敏感数据(用户密码)。elasticsearch    requestDump, err := httputil.DumpRequest(req, true)    responseDump, err := httputil.DumpResponse(resp, true)    esapiClient.log.Printf("got response code %d when creating user: %s\n", resp.StatusCode, user.Username)    if resp.StatusCode != http.StatusOK {        esapiClient.log.Printf("error: got response code: %d when creating user %s\n", resp.StatusCode, user.Username)        esapiClient.log.Println("Request\n", string(requestDump))        esapiClient.log.Println("Response\n", string(responseDump))        return ErrResponseCode    }当事情向南发展时,我希望能够转储请求和响应(特别是在情况下)以检查出了什么问题(主要是潜在的格式错误的请求)。400推荐的执行此操作方法是什么?日志级别是解决此问题的唯一方法吗?
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

日志级别是非解决方案。您的目标应该是不要让 PII(个人身份信息)完全进入日志转储,包括当您在调试模式下启动服务时。


根据您执行日志记录的方式,只需在结构上实现相关接口,并省略或密文包含 PII 的字段。如果需要对原始值有一些了解以进行调试的字段,则只能对其进行部分密文。


例如,如果使用谓词或类似词登录,则可以实现该接口:fmtStringer


type User struct {

    Name     string

    Password string

}


func (u User) String() string {

    return fmt.Sprintf("{%s %s}", u.Name, "*****")

}



func main() {

    u := User{"pkaramol", "secret"}

    fmt.Println(u) // {pkaramol *****}

    

}

如果您登录 JSON,请实施以进行密文,或使用结构标记省略:MarshalJSONjson:"-"


func (u User) MarshalJSON() ([]byte, error) {

    return json.Marshal(map[string]interface{}{

        "name": u.Name,

        "password": "*****",

    })

}


func main() {

    u := User{"pkaramol", "secret"}

    b, _ := json.Marshal()

    fmt.Println(string(b)) // {"name":"pkaramol","password":"*****"}

}


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 53 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信