2016-08-20 3 views
0

私はいくつかのユーザー入力、主にディレクトリパスとファイル名を必要とするbashスクリプトを書いています。プログラムは指定されたディレクトリとファイルを作成します。Bash/Shellスクリプトの安全な入力検証

ディレクトリパスを書いて、私は絶対パスを要求 - 〜/ DIR/...、または$ PATH/DIR/...または./DIR/...は許可されていません。ディレクトリー・パスは、/DIR/DIR/...の形式でのみ提供され、/DIR/DIR/..//filenameという形式のファイル・パスと、ファイル名の形式で提供されます。 また、ユーザーがコマンドラインオプションを追加していないことを確認したい場合もあります。例えば、sudoを実行した場合、入力にはどこにでも-uが追加されません。

しかし、ディレクトリパスとファイル名にはハイフン、アンダースコア、スペース、ピリオド、英数字が含まれている可能性があるため、入力をサニタイズするための最良の方法ではありません。他の文字を検出する必要があります。

ユーザ入力は、の読み取りによって集められます。私はUbuntuシステムを使用していますので、Ubuntuシェルに準拠していれば動作します。 デフォルトのシステムパッケージのみがインストールされているとします。

バリデーションの個々のセクションを処理するために複数のオプションを使用することができます(例:--を使用して次のデータをパラメータとして扱い、コマンドではなくディレクトリパスを処理する別のオプションとして扱います)。

ディレクトリ構造の正しいマッピングには絶対パスが必要です。パスの他のフォーマットは、パスの文字列で実行している関数のために、プログラムが他のパスにマッチしたり追加されたりすると構造を誤って解釈する原因になります。

ありがとうございます。 - パラメータとして以下のテキストを解釈する私は、いくつかの状況ではのrealpathREADLINKを使用して、を使用して、受け入れ答えを使用:働いた何


。相対パスを許可する場合は、パスとしてreadlinkまたはrealpathの結果を使用します。相対パスを許可しない場合は、元の文字列をreadlinkまたはrealpathの結果と比較します。

+3

ほとんどのコマンドは '--'オプションをサポートしています。これにより、以降のすべてのパラメータを引数として扱い、オプション/フラグは扱わなくなります。それ以外は、展開を避けるために、すべての変数を二重引用符で囲みます。 – Siguza

+0

これは最初の2つの問題を処理しますが、私のプログラムが受け入れることができない形式でディレクトリパス全体を使用できるということは変わりません。無効な入力を拒否するか、有効な入力に適合させる必要があります。 –

+0

Re:「自分のプログラムが受け入れることができない形式のディレクトリパス全体をユーザーが受け入れることができます。無効な入力を拒否するか、有効な入力に適合させる必要があります」:*または*このような形式を受け入れるようにプログラムを変更できます。 。 。 – ruakh

答えて

2

あなたはこのような何か行うことができます:

#!/bin/bash 

set -e  

while read path; do 
    result=`realpath -m -- "$path"` 
    if [ "$result" != "$path" ] && [ "$result/" != "$path" ] ; then 
     echo "Rejected: $path" 
    else 
     last_char_index=$((${#path}-1)) 
     last_char=${path:$last_char_index:1} 
     if [ "$last_char" == "/" ]; then 
      echo "New directory: $path" 
      mkdir -- "$path" 
     else 
      echo "New file: $path" 
      touch -- "$path" 
     fi 
    fi 
done 

exit 0 

私は(いずれかが可能である場合)、コマンドインジェクションを防ぐために、二重引用符の間、その後常に利用のユーザーの入力を相対パスをキャッチするためにrealpathを使用します。 私は考えるより良い方法があると思いますが、それは私が考えることができるすべてです。

編集:コメントに助言として、私は、ファイル/ディレクトリ名を安全にtouchmkdirrealpathに与えられていることを確認するために--を追加しました。

+2

変数をクォートしても、オプションとして解析されることはありません。それには '--'を使います。 – Siguza

+0

@Siguzaこのスクリプトが安全でない例を教えてください。 – yoones

+2

私はそれが悪用可能であるとは言いませんでしたが、あなたはpath = '-X'を設定して、無効なオプションでrealpathがクラッシュする可能性があります。また、 'set -e;'にする必要があります。そうしないと、path = ''''を設定することができます。エラーメッセージはstderrではなくstdoutに出力されるので、realpathはクラッシュしますが、 'else'ブロックは実行されます。やはり、悪用できませんが、おそらく望ましくありません。 – Siguza