続・GoでパスワードなどをPrintfで出力させたくない

2016-11-16  /  Go

前回、Go でパスワードなどを Printf で出力させたくないというのを書いたけど、
その後 GoStringer というインターフェースがあることを知ったので再度試してみた。

前回のおさらい

前回上手く隠蔽できずに出力されてしまったのが、以下。
%+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

よっしゃー!うまく隠蔽された。

これでログとかに意図せず出力されることが回避できそう。

Published: 2016-11-16  /  Tags: Go  /  Share: X