公開したコードにパスワードが
ある市役所が、施設予約システムの開発を地元の会社に頼みました。
担当者はコードを公開の場所に置き、チームで共有しました。そのコードには、データベースのパスワードがそのまま書かれていました。
数日後、知らない場所から予約データに接続した記録が見つかりました。秘密はどこに置けばよかったのでしょうか。
このレッスンのゴール
メモ
秘密の情報をコードの外に置くことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| シークレット | 他人に知られてはいけない設定の値です。 | パスワード、APIキー |
| 環境変数 | プログラムの外から渡す設定の値です。 | |
| .gitignore | Git に入れないファイルを書いておくファイルです。 | |
| 入力チェック | 受け取った値が正しい形か確かめることです。 | |
| 許可リスト | 通してよい形だけを決めておく方法です。 |
学生が入力するセルは、このプレビューでは空白です。
秘密はコードの外に置く
コードは、チームの仲間や外注先など、多くの人の目に触れます。そこにシークレットを書くと、コードを見た全員に秘密が渡ります。
そこで秘密は環境変数として、プログラムの外から渡します。開発のときは .env というファイルに書き、.gitignore に入れて Git には載せません。
コードには「DB_PASSWORD という名前の値を使う」とだけ書きます。
試す: .env と .gitignore
mkdir -p yoyaku && cd yoyaku
# 秘密は .env というファイルに置き、Git には入れません
printf 'DB_PASSWORD=renshu-dummy-0000\n' > .env
printf '.env\n' > .gitignore
# .env を読み込み、プログラムから使える環境変数にします
set -a; . ./.env; set +a
# 秘密そのものは表示せず、長さだけ確かめます
printf '%s' "$DB_PASSWORD" | wc -c
cat .gitignore
# printf で MAIL_PASSWORD=renshu-dummy-1111 を .env に足し、読み込み直してください。
試す: Python で環境変数を読む
import os
# 本番では、この行はサーバーの設定が行います。コードには書きません
os.environ["DB_PASSWORD"] = "renshu-dummy-0000"
if "DB_PASSWORD" in os.environ:
password = os.environ["DB_PASSWORD"]
print("パスワード", len(password), "文字で接続します")
else:
print("DB_PASSWORD がありません。ここで止めます")
# 秘密をそのままログに出してはいけません。
# os.environ の行を消して、もう一度実行してください。
よくある思い違い
注意
「パスワードを書いたコミットを消せば大丈夫」と考える方は多いです。Git は過去の変更をすべて残すので、履歴から読めてしまいます。一度でも公開したら、その秘密は漏れたものとして、すぐに変更します。
入力は許す形だけを通す
画面から入る値は、利用者が自由に入れられます。間違いもあれば、攻撃もあります。
安全なのは許可リストの考え方です。「郵便番号は 3 けた、ハイフン、4 けた」のように、正しい形を決めます。それ以外はすべて受け付けません。
危ない記号を探して消す方法は、見落としが出やすいので頼りません。
例: 予約フォームの入力チェック
| 入力された値 | 郵便番号の形か | 結果 |
|---|---|---|
| 530-0001 | はい | 受け付ける |
| 5300001 | ハイフンがない | エラーを表示 |
| 53A-0001 | 数字でない文字がある | エラーを表示 |
| 530-0001' OR '1'='1 | 長すぎる | エラーを表示 |
学生が入力するセルは、このプレビューでは空白です。