私はいくつかのユーザー入力、主にディレクトリパスとファイル名を必要とするbashスクリプトを書いています。プログラムは指定されたディレクトリとファイルを作成します。Bash/Shellスクリプトの安全な入力検証
ディレクトリパスを書いて、私は絶対パスを要求 - 〜/ DIR/...、または$ PATH/DIR/...または./DIR/...は許可されていません。ディレクトリー・パスは、/DIR/DIR/...の形式でのみ提供され、/DIR/DIR/..//filenameという形式のファイル・パスと、ファイル名の形式で提供されます。 また、ユーザーがコマンドラインオプションを追加していないことを確認したい場合もあります。例えば、sudoを実行した場合、入力にはどこにでも-uが追加されません。
しかし、ディレクトリパスとファイル名にはハイフン、アンダースコア、スペース、ピリオド、英数字が含まれている可能性があるため、入力をサニタイズするための最良の方法ではありません。他の文字を検出する必要があります。
ユーザ入力は、の読み取りによって集められます。私はUbuntuシステムを使用していますので、Ubuntuシェルに準拠していれば動作します。 デフォルトのシステムパッケージのみがインストールされているとします。
バリデーションの個々のセクションを処理するために複数のオプションを使用することができます(例:--
を使用して次のデータをパラメータとして扱い、コマンドではなくディレクトリパスを処理する別のオプションとして扱います)。
ディレクトリ構造の正しいマッピングには絶対パスが必要です。パスの他のフォーマットは、パスの文字列で実行している関数のために、プログラムが他のパスにマッチしたり追加されたりすると構造を誤って解釈する原因になります。
ありがとうございます。 - パラメータとして以下のテキストを解釈する私は、いくつかの状況ではのrealpathとREADLINKを使用して、を使用して、受け入れ答えを使用:働いた何
。相対パスを許可する場合は、パスとしてreadlinkまたはrealpathの結果を使用します。相対パスを許可しない場合は、元の文字列をreadlinkまたはrealpathの結果と比較します。
ほとんどのコマンドは '--'オプションをサポートしています。これにより、以降のすべてのパラメータを引数として扱い、オプション/フラグは扱わなくなります。それ以外は、展開を避けるために、すべての変数を二重引用符で囲みます。 – Siguza
これは最初の2つの問題を処理しますが、私のプログラムが受け入れることができない形式でディレクトリパス全体を使用できるということは変わりません。無効な入力を拒否するか、有効な入力に適合させる必要があります。 –
Re:「自分のプログラムが受け入れることができない形式のディレクトリパス全体をユーザーが受け入れることができます。無効な入力を拒否するか、有効な入力に適合させる必要があります」:*または*このような形式を受け入れるようにプログラムを変更できます。 。 。 – ruakh