.envパスワードエスケープ
シェル、Node.jsのdotenv、python-dotenv、docker --env-fileが、引用符や$も含めて正確に読み戻せるよう、パスワードを.envの行として書き出します。
各行は、パーサーがパスワードをそのまま読み戻せるよう引用符で囲まれます。シェルはシングルクォートを使い、クォート自体は '\'' と書きます。Node の dotenv はシングル・ダブル・バッククォートから選び、python-dotenv はシングルクォート内の \ と \' をエスケープし、docker --env-file は行の残りをそのまま値として扱います(引用符なし)。
すべてブラウザ内で実行されます。データがアップロードされることはありません。
.envパスワードエスケープとは?
引用符、ドル記号、#、バックスラッシュを含むパスワードは、.envファイルを壊したり、変数展開で書き換えられたりしがちです。このツールは、各パーサーがあなたのパスワードそのままに読み戻せるKEY=value行を書き出し、パーサーが値を表現できない場合は警告します。
.envパスワードエスケープの使い方
- 変数名を入力します(例:DB_PASSWORD)。
- パスワード欄にパスワードを入力します。
- 対象に合わせた行をコピーします:シェル/POSIX、Node.js dotenv、python-dotenv、docker run --env-file。
- .envファイルに貼り付けます。
例
Variable DB_PASSWORD, password p@ss'w"rd$1
Shell: DB_PASSWORD='p@ss'\''w"rd$1' Node dotenv: DB_PASSWORD=`p@ss'w"rd$1` python-dotenv: DB_PASSWORD='p@ss\'w"rd$1' docker --env-file: DB_PASSWORD=p@ss'w"rd$1
.envパスワードエスケープを使うべき場面
シークレットに英数字以外の文字が含まれるときはいつでも使います。シークレットを自分で決められる場合は、長い英数字だけの値にすれば、エスケープの問題を完全に避けられます。
.envパスワードエスケープの仕組み
シェル:値をシングルクォートで囲み、各 ' を '\'' にします(シングルクォート内では展開されません)。Node dotenv(v15以降):シングルクォートはそのまま文字として扱われます。値に ' が含まれる場合はダブルクォートを使い(\n と \r だけが解釈されます)、それ以外はバッククォートを使います。バックスラッシュで終わる値や、3種類すべての引用符を含む値は表現できません。python-dotenv:シングルクォートで、\ と ' を \\ と \' にエスケープします。docker --env-file:引用符はまったく使わず、行の残りがそのまま値になるため、改行は不可能です。
一般的な使用例
- $や引用符を含むデータベースパスワードの.envファイルへの追加
- docker run --env-file 用のシークレットの準備
- #で切れてしまうdotenvの値の修正
- シェルスクリプト用のexport文の作成
よくある質問
ダブルクォートを使えばよいのではないですか?
ダブルクォート内では、シェルや一部のdotenvローダーが $VAR を展開し、バックスラッシュを解釈するため、パスワードが黙って書き換えられてしまいます。
docker --env-fileの行に引用符がないのはなぜですか?
docker run --env-file は引用符を処理せず、引用符が値の一部になってしまうためです。
Docker Composeも同じルールですか?
Docker Composeの.envパーサーには独自の補間ルールがあり、このツールはそれを再現していません。Composeのドキュメントを確認するか、リテラルのドル記号には $$ を使ってください。