文字列変数を使用したシェルコマンドの保護

文字列変数を使用したシェルコマンドの保護

プログラミング言語では、単純なシェルコマンドを実行します。

cd var; echo > create_a_file_here

そして変わりやすい"create_a_file_here" ファイルを生成するディレクトリ文字列を含む変数です。今誰もがこのコード行を見ている場合は、次のような割り当てでそれを悪用することができます。

var = "; rm -rf /"

状況は本当に醜くなる可能性があります。上記の状況を回避する1つの方法は、文字列を検索することです。変わりやすいシェルコマンドを実行する前に、「;」などのいくつかの特殊文字について説明しましたが、これが可能なすべての脆弱性に対処していると思われます。

"cd var"がディレクトリだけを変更し、他のものを変更しないようにする良い方法を知っている人はいますか?

ベストアンサー1

簡単な解決策:プログラム内でシェルを呼び出さないでください。絶対にしないでください。

ここの例は簡単であり、どのプログラミング言語を使用してもディレクトリの変更とファイルの作成が簡単になります。ただし、外部コマンドを実行する必要がある場合でも、通常はシェルを介して実行する必要はありません。

たとえば、Pythonは実行する代わりにをos.system("somecmd " + somearg)使用しますsubprocess.run(["somecmd", somearg])。 Cでは、代わりにand(またはそれを実行するライブラリを見つけてください)をsystem()使用してください。fork()exec()

シェルを使用する必要がある場合は、コマンドライン引数を引用するか、次のように環境を介して渡します。スティーブンの答え。また、特殊文字が気になる場合は、正しい解決策は次のとおりです。いいえ潜在的に危険な文字をフィルタリング(ブラックリスト)してみてください。維持する既知の安全な文字(許可リスト)。

機能をしっかり知っているキャラクターだけを許可すると、何かを逃す危険が減ります。最終結果は単に許可することにすることですが[a-zA-Z0-9_]、これは作業を完了するのに十分かもしれません。また、ロケールとツールセットに、äなどのöアクセント文字が含まれていないことを確認することもできます。どんなシェルでも特別とは見なされないかもしれませんが、通過することを確認するのが最善です。

おすすめ記事