PHPやPythonなどのスクリプト言語で、パスワードなどの情報をプログラムソースコード内にハードコードするのはセキュリティの観点からよくありません。パスワードなどを簡単に隠蔽するには様々な方法がありますが、PHPと共有できる方法などが便利です。
「.env」ファイルを使う方法
手っ取り早くハードこーディングしたくない情報をソースコードの外に出す方法の1つに「.env」があります。この「.env」ファイルに情報を書いておいてプログラムから読み取ります。
インストール
Pythonの場合
pip install python-dotenv
PHPの場合
composer require vlucas/phpdotenv
初期設定(プログラムの冒頭で)
Pythonの場合
import dotenv
dotenv.load_dotenv()
PHPの場合
require_once __DIR__ . '/vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
使い方
Pythonの場合
setting_api_key = os.getenv("SETTING_API_KEY")
os.getenv( “キー名”, “デフォルト値” )
PHPの場合
$setting_api_key = $_ENV['SETTING_API_KEY'];
定義ファイル「.env」
プログラムと同じフォルダに「.env」ファイルを作成します。
#
# コメント
#
SETTING_API_KEY=api_key_string # データ定義
注意点:
左辺がキー名、右辺がデータですが、
① 「” (ダブルクオート)」や「’ (シングルクオート)」で括ってはいけません。
② 「=」の左右には空白を入れない
.githubから隔離しておく
GitHubに持っていかれないように「.gitignore」ファイルを作っておきます。
このファイルには、GitHubに取り込んでほしくないファイルやフォルダを書いておきます。
# パスワードや秘密情報が入った.envはGit管理しない
.env
# 一時ファイルやキャッシュもGit管理しない
*.pyc
__pycache__/
# IDE設定ファイル(例:VSCodeやPyCharmなど)もGit管理しない
.vscode/
.idea/
その他の便利な使い方&ライブラリ
定義が無い場合に異常終了するロジック
DB_PATH = os.getenv("DB_PATH") or sys.exit("設定ファイルエラー")
列挙型も.envに入れられるロジック
Logger.DEBUGのような列挙型も.envに入れることができます。
# .env に書く内容
DEFAULT_LOG_LEVEL=INFO
import os
import logging
import logging.handlers
level_name = os.getenv("DEFAULT_LOG_LEVEL", "INFO").upper() # 例: "INFO"
# getattrを使って列挙型のメンバーを取得
level = getattr(LogLevel, level_name, LogLevel.INFO)
logger.setLevel(level.value) # ログレベルの設定
あると便利な共通関数
下記のような関数を作っておくと、.env ファイルの設定忘れ時にエラーを出すことができます。
# -------------------------------------------------------
# 環境変数チェック&アベンド
# -------------------------------------------------------
def require_env_vars(*keys):
"""
指定された環境変数名のうち1つでも未設定ならアベンド(sys.exit)。
未設定ならキー一覧を表示。
"""
missing = [k for k in keys if not os.getenv(k)]
if missing:
msg = "以下の環境変数が未設定です: " + ", ".join(missing) + "(.envファイルを確認してください)"
print(msg, file=sys.stderr, flush=True)
sys.exit(1)
使い方
キー名を列挙しておけば、設定されていないキーがあればエラーを吐いてアベンドします。
require_env_vars("DEFAULT_LOG_LEVEL","DEFAULT_LOG_ROTATE_SIZE")