続・GoでパスワードなどをPrintfで出力させたくない
2016-11-16 / Go
前回、Go でパスワードなどを Printf で出力させたくないというのを書いたけど、
その後 GoStringer というインターフェースがあることを知ったので再度試してみた。
- fmt.Formatter を実装して%v や%+v をカスタマイズしたり、%3🍺 みたいな書式をつくってみよう #golang - Qiita
- fmt - The Go Programming Language
前回のおさらい
前回上手く隠蔽できずに出力されてしまったのが、以下。
%+v だと出力されないんだけど、%#v だと出力されてしまう…
type Password string
func (p Password) String() string {
return "FILTERED"
}
type User struct {
Name string
Password Password
}
func main() {
u := &User{
Name: "namae",
Password: Password("pass"),
}
fmt.Printf("%#v", u)
// &main.User{Name:"namae", Password:"pass"}
}
https://play.golang.org/p/1BT9E4dM17
GoStringer を実装する
package main
import (
"fmt"
)
type Password string
func (p Password) String() string {
return "FILTERED by String"
}
func (p Password) GoString() string {
return "FILTERED by GoString"
}
type User struct {
Name string
Password Password
}
func main() {
u := &User{
Name: "namae",
Password: Password("pass"),
}
fmt.Printf("%#v", u)
// &main.User{Name:"namae", Password:FILTERED by GoString}
}
https://play.golang.org/p/H_ccstzjCC
よっしゃー!うまく隠蔽された。
これでログとかに意図せず出力されることが回避できそう。