続・GoでパスワードなどをPrintfで出力させたくない
前回、GoでパスワードなどをPrintfで出力させたくない - kawaken's blog というのを書いたけど、 その後 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
よっしゃー!うまく隠蔽された。
これでログとかに意図せず出力されることが回避できそう。