クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

秘密をコードに書かない

このレッスンのあとで: 秘密の情報をコードの外に置くことができる。

50分のレッスンコマンドなし

公開したコードにパスワードが

ある市役所が、施設予約システムの開発を地元の会社に頼みました。

担当者はコードを公開の場所に置き、チームで共有しました。そのコードには、データベースのパスワードがそのまま書かれていました。

数日後、知らない場所から予約データに接続した記録が見つかりました。秘密はどこに置けばよかったのでしょうか。

このレッスンのゴール

メモ

秘密の情報をコードの外に置くことができる。

キーワード

ことばいみれい
シークレット他人に知られてはいけない設定の値です。パスワード、APIキー
環境変数プログラムの外から渡す設定の値です。
.gitignoreGit に入れないファイルを書いておくファイルです。
入力チェック受け取った値が正しい形か確かめることです。
許可リスト通してよい形だけを決めておく方法です。

学生が入力するセルは、このプレビューでは空白です。

秘密はコードの外に置く

コードは、チームの仲間や外注先など、多くの人の目に触れます。そこにシークレットを書くと、コードを見た全員に秘密が渡ります。

そこで秘密は環境変数として、プログラムの外から渡します。開発のときは .env というファイルに書き、.gitignore に入れて Git には載せません。

コードには「DB_PASSWORD という名前の値を使う」とだけ書きます。

試す: .env と .gitignore

コード: bash
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 で環境変数を読む

コード: 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長すぎるエラーを表示

学生が入力するセルは、このプレビューでは空白です。

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。