bashでユーザーが入力したパスワードをプログラムのstdinの一部にするための最も安全で簡単な方法は何ですか?

ジム・ホーグランド

私は、(1)最も安全で(2)ユーザーにbashシェルプロンプトでパスワードを入力させ、そのパスワードをプログラムの標準入力の一部にする最も簡単な方法を探しています。

これは、stdinがどのように見える必要があるかです:{"username":"myname","password":"<my-password>"}<my-password>シェルプロンプトに入力されたものはどこですか。プログラムstdinを制御できる場合は、パスワードの入力を安全に要求して配置するようにプログラムを変更できますが、ダウンストリームは標準の汎用コマンドです。

私は、以下を使用するアプローチを検討し、拒否しました。

  • ユーザーがコマンドラインにパスワードを入力します。パスワードは画面に表示され、「ps」を介してすべてのユーザーに表示されます。
  • 外部プログラム(例...$PASSWORD...への引数へのシェル変数の補間:パスワードは引き続き「ps」を介してすべてのユーザーに表示されます
  • 環境変数(環境に残されている場合):パスワードはすべての子プロセスに表示されます。信頼できるプロセスでさえ、診断の一部としてコアまたは環境変数をダンプすると、パスワードが公開される可能性があります
  • 厳しい権限を持つファイルであっても、ファイルに長期間存在するパスワード:ユーザーが誤ってパスワードを公開したり、rootユーザーが誤ってパスワードを確認したりする可能性があります

私は現在の解決策を以下の答えとして挙げますが、誰かがそれを思いついた場合、喜んでより良い答えを選択します。もっと簡単なものがあるべきだと思っているか、誰かが私が見逃したセキュリティ上の懸念を見ているかもしれません。

ステファン・チャゼラス

bashzsh

unset -v password # make sure it's not exported
set +o allexport  # make sure variables are not automatically exported
IFS= read -rs password < /dev/tty &&
  printf '{"username":"myname","password":"%s"}\n' "$password" | cmd

がないIFS=read、入力したパスワードから先頭と末尾の空白が削除されます。

がないと-r、円記号を引用文字として処理します。

ターミナルからのみ読み取るようにします。

echo確実に使用することはできません。ではbashzshprintfそのコマンドラインの出力に表示されないように、組み込みされますps

ではbash、引用する必要があります。$passwordそうしないと、split + glob演算子が適用されます。

ただし、その文字列をJSONとしてエンコードする必要があるため、これはまだ間違っています。たとえば、少なくとも二重引用符と円記号は問題になります。おそらく、これらの文字のエンコードについて心配する必要があります。あなたのプログラムはUTF-8文字列を期待していますか?あなたの端末は何を送信しますか?

プロンプト文字列を追加するには、次のようにしますzsh

IFS= read -rs 'password?Please enter a password: '

bash

IFS= read -rsp 'Please enter a password: ' password

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ