2011-01-19 13 views
2

サブプロセス(shell = False)内で使用する前に、外部ソース(例:xmlファイル)からファイル名をサニタイズする一般的な方法は何ですか?ファイル名を正しくサニタイズする方法(シェルインジェクションから保護する)?

更新: いくつかのパースされた文字列を送信する前に、いくつかの基本的なセキュリティチェックを行いたいと思います。この例では、リモートモードでmpg123(コマンドラインaudioplayer)を使用してサウンドファイルを再生します。

filename = child.find("filename").text # e.g.: filename = "sound.mp3" 
pid = subprocess.Popen(["mpg123"],"-R"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
command = "L "+filename+"\n" 
pid.stdin.write(command.encode()) 
+0

シェルが関係していない場合、なぜファイル名をサニタイズしたいのですか? – lunaryorn

+1

システム/プライベートファイルの上書きや読み取りを避けるには? – TryPyPy

+0

サニタイズは何ですか?あなたは詳細を与える必要があります。 – marcog

答えて

1

シェルを使用している場合や何かを実行している場合を除き、ファイル名はサニタイズする必要はありません。 Pythonのopen()は、指定されたファイル名にコマンドを実行しません。

セキュリティチェックでは、ファイルの上書きを避けるために、使用しているOSのパーミッションシステムを使用し、プログラムを実行しているユーザだけが上書きしてアクセスできるファイルを上書きしてアクセスできるようにします。

ネットや他のプロセスからの入力を受け取るプログラムに絶対パス名を受け入れることは、一般的にはお勧めできません。この場合、定義された音楽フォルダの下にのみファイルを指定することができます。私はMP3プレーヤーが間違ったファイルを与えることによって損害を引き起こす可能性があるとは思わないが、少なくともクラッシュする可能性があり、それは迷惑になるだろう。

+0

これはしばしば、私たちがする損害を引き起こすと思わないプログラムです。私は、この特定のケースでは、もしあれば、おそらくかなり小さくなると思います。 – dietbuddha

+0

@dietbuddha:確かに、それを特定のディレクトリに制限することが重要です。そして、ルートなどとして実行していないが、それは別の質問です。 :) –

3

私が考えることができることはいくつかあります。

システムに許容性がある場合は、軽量確認を行うことができます。また、データ破壊の機会がほとんどなく、機密データが侵害されないようにすることも適切です。 os.path.isfileを使用して、指定した文字列が実際のファイルであるかどうかを調べることができます。

より古典的な「安全」なプログラミング設計では、再生可能なファイルのインデックスを作成し、ユーザーの入力に基づいてルックアップを行うことができます。このようにして、実際にユーザーの入力を渡すことはありません。それは、既に検証されたデータ(受け入れられた再生可能なファイルリスト)に対するルックアップによって「フィルタリング」されます。

「サニタイズ」入力はブラックリスト形式の技術です。ホワイトリスト形式の技術(上記)よりも安全性が低いです。データを「サニタイズ」するしかない場合は、そのデータがシステムをどのように通過するか、それに依存する他のシステムを理解する必要があります。その後、すべてのシステム内の欠陥や制限を考慮するルールを作成する必要があります。また、データ入力サイズ、許容できない文字エンコーディングなどの古典的な悪意のある入力ケースをカバーする必要があります。

関連する問題