主要观点:Go 默认可轻松格式化、记录或输出多数类型的值,但处理敏感值时会有问题,如用户提交的明文密码等。
关键信息:
- 未导出字段不足以防止敏感值泄露,其他包可通过反射或
unsafe
包访问。 - 可通过实现特定接口防止数据泄露,如
fmt.Formatter
、slog.Valuer
、encoding.TextMarshaler
等。 - 推荐返回特定字符串(如
<!SECRET_REDACTED!>
)用于标记意外泄露的敏感数据,并设置警报检测。
重要细节: fmt.Formatter
接口可确定类型的格式化方式,实现后返回硬编码值可防止fmt.Println
等函数泄露敏感数据。slog.Valuer
接口用于在结构化日志中隐藏值,返回硬编码值或空字符串可防止敏感值被记录。encoding.TextMarshaler
接口用于控制文本编码,实现后可防止json
和xml
包泄露非结构体类型的敏感值,也可分别实现json.Marshaler
和xml.Marshaler
。- 在示例 Web 应用中使用这些解决方案防止原始密码意外被记录。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。