在响应中包含err.Error()总是安全的吗?

时间:2016-01-15 09:19:33

标签: go error-handling

示例:

err := Db.Find(&event, id).Error
if err != nil {
    c.JSON(500, err.Error())
    return
}

我担心它可能包含敏感信息。示例:当连接到数据库并且db凭据无效时,我担心错误消息可能类似于:“invalid username:sample and password:xxx”

2 个答案:

答案 0 :(得分:3)

有效地,您回答了自己的问题:您指出它可能包含敏感信息,这意味着始终可以安全地将其包含在用户可见的回复中。

它还可能包含与您的实现相关的信息(例如包名称,类型名称,调用层次结构)以及配置数据(例如服务器名称,数据库名称,用户名等),可能会暴露私有和敏感的体系结构和业务信息。

考虑一下:您是一个包作者,并且您创建了函数/方法返回的error值(错误消息)。您创建描述性错误消息,描述所请求的函数无法正常完成的原因,用于该函数/方法的调用者(开发人员),用于最终用户 - 谁不应该知道幕后发生了什么。

error.Error()消息适用于开发人员。它们在测试期间也很有用。它们对于追捕虫子是不可或缺的。您不应该向用户显示它们,而是将它们记录到您有权访问的用户,并向用户提供更一般或用户友好的错误消息,确保他们已通知开发团队并正在调查问题。显示原始错误消息可能会导致无经验用户混淆,并可能引发安全问题。

答案 1 :(得分:1)

最好的方法是写入错误日志,并返回自定义数据库错误信息。

像:

var (
    ErrEventNotFound = "Event not found."
)

err := Db.Find(&event, id).Error
if err != nil {
    // Log to file
    c.JSON(500, ErrEventNotFound)
    return
}