私は(1)ユーザーがbashシェルプロンプトにパスワードを入力し、そのパスワードがプログラムの標準入力の一部になるようにする最も安全で(2)最も簡単な方法を探しています。
これがstdinの外観です:{"username":"myname","password":"<my-password>"}
、<my-password>
シェルプロンプトに入力された内容はどこにありますか?プログラムの標準入力を制御できる場合は、パスワードを安全に入力して所定の位置に置くように変更できますが、ダウンストリームは標準の汎用コマンドです。
私は次の方法を考えて拒否しました。
- ユーザーはコマンドラインにパスワードを入力します。パスワードは画面に表示され、「ps」を介してすべてのユーザーに表示されます。
- シェル変数は、外部プログラムのパラメータ(たとえば
...$PASSWORD...
)に挿入されます。パスワードはまだ「ps」を介してすべてのユーザーに表示されます。 - 環境変数(環境に残っている場合):パスワードはすべての子プロセスに表示されます。信頼できるプロセスであっても、診断中にコアをダンプしたり環境変数をダンプしたりすると、パスワードが公開される可能性があります。
- パスワードは、厳格な権限を持つファイルにも長い間ファイルに保存されます。ユーザーは誤ってパスワードを公開し、ルートは誤ってパスワードを表示する可能性があります。
現在の解決策を以下の答えとして残しておきます。しかし、誰かがより良い答えを提案したら、喜んでより良い答えを選択します。もっと簡単なものがあるべきだと思います。あるいは、誰かが私が逃したセキュリティ問題を見つけたかもしれません。
ベストアンサー1
またはbash
:zsh
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
安定して使用できません。bash
および にはがzsh
組み込まれprintf
ているため、 の出力にコマンドラインは表示されませんps
。
あなたはbash
引用する必要があります$password
。そうでなければ分割+グローバル演算子が適用されます。
しかし、その文字列をJSONにエンコードする必要があるため、これはまだ間違っています。たとえば、二重引用符とバックスラッシュは少なくとも問題です。これらの文字のエンコードについて心配する必要があるかもしれません。プログラムにUTF-8文字列が必要ですか?あなたの端末は何を送っていますか?
プロンプト文字列を追加するには、次のようにしますzsh
。
IFS= read -rs 'password?Please enter a password: '
そしてbash
:
IFS= read -rsp 'Please enter a password: ' password