定数文字列を使用してsystem(3)またはpopen(3)を呼び出すときのトラップは何ですか?

定数文字列を使用してsystem(3)またはpopen(3)を呼び出すときのトラップは何ですか?

PATH、およびいくつかの変数などの「問題のある」環境変数を明示的に設定したと仮定すると、値IFSがコンパイル時定数である文字列にANDを使用するのはどれほど悪い考えですか(Unicesと奇妙なものと同じ違いを許容するために)LC_*非POSIX)。popensystem/bin/sh

たとえば、次のコードスニペットを使用して現在のディレクトリのファイルに対して深度優先検索を実行するCコードがある場合、これはセキュリティ/正確性の観点から問題になりますか?

FILE* fh = popen("2>/dev/null /usr/bin/find . -print0 -type f");

編集:クリーンな環境を強制し、非ポータブルオプションを含まない例

FILE* fh = popen("2>/dev/null /usr/bin/env -i /usr/bin/find . -type f");

答え1

「不愉快な」環境変数を明示的に設定したとします。

しないでください。

プログラムが興味を持っている可能性があるすべての環境変数を識別するのは少し難しいです。プログラムにクリーンな環境を提供し、必要な変数だけを設定する方が簡単です。

このような単純なコマンドを実行する場合は、次のいずれかの機能を使用してexec他のシェルを心配する必要はありません。

標準ユーティリティを呼び出すことを知っていれば、そのユーティリティが何をしているのかを明確に知ることができます。関数を直接実装すると、リソース制約などもプログラムに影響を与える可能性があります。ただし、使用しているようfindな非標準の拡張機能を持ついくつかのバリエーションがあるため、-print0それを使用する場合は、それをサポートする外部プログラムのバージョンによって異なります。

関連情報