GolangとDBを接続して株価データをチャート表示するの続きです。
前回の記事では、ユーザIDやパスワードをソースにベタ書きしていました。
7Payもびっくりのセキュリティホールですね。
db, err := sql.Open("sqlserver", "server=.;user id=sa;password=password;database=Stock")
今回は、ソースに接続に必要な情報を書くことなくDBに接続を行う方法をまとめていきます。
godotenv
結論から言うと、godotenvというモジュールをインポートして使います。
①go get github.com/joho/godotenvをターミナルで実行
②インポート
import (
...
"github.com/joho/godotenv"
)
これだけです。
.envファイルを用意
.env(dotenv)ファイルに関する説明はこちらが分かりやすいです。
今回は、ユーザIDとパスワードを以下のように書きます。
.envファイルはmain.goと同階層に置きます。
DB_USER = "sa"
DB_PASSWORD = "password"
.envファイルを読み込み
実際に.envファイルを読み込むときに使うのが、最初にインポートしたgodotenvです。
以下のようにLoadメソッドを使います。
godotenvのソースを追っていくとわかりますが、filenamesの引数が空文字の場合には、自動的に.envファイルを参照するようになります。
.envファイルの情報を読み込んだら、後はos.Getenvメソッドで情報を読み込むことができます。
func GetData(stockcode string) (df *StockData, err error) {
//べた書き禁止!
// db, err := sql.Open("sqlserver", "server=.;user id=sa;password=password;database=Stock")
e := godotenv.Load() //Load env.file
if e != nil {
log.Println(e)
}
dbConnection := fmt.Sprintf("server=.;user id=%s;password=%s;database=Stock", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"))
db, err := sql.Open("sqlserver", dbConnection)
defer db.Close()
...
}
func Load(filenames ...string) (err error) {
filenames = filenamesOrDefault(filenames)
for _, filename := range filenames {
err = loadFile(filename, false)
if err != nil {
return // return early on a spazout
}
}
return
}
func filenamesOrDefault(filenames []string) []string {
if len(filenames) == 0 {
//引数が空なら自動で.envを参照
return []string{".env"}
}
return filenames
}
最後に注意点
さて、前回と比べてセキュリティを考慮したソースが完成しました。
ただ、.envファイルをgithubにアップロードしたら、最悪AWSサーバのパスが抜かれてしまいますね。
そういう場合に備えて、.gitignoreファイルにはしっかり.envを登録しておきましょう。
.env