Pythonのヒント:パスワードを隠す

Programing-Language-Python

 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")

 

タイトルとURLをコピーしました