2012-02-20 11 views
3

ユーザーがWebインターフェイス経由でUNIXパスワードを変更する機能を公開しているWebアプリケーションを検討しています。認証されたWebユーザは、彼のUnixユーザ名と希望するパスワードを与えます。 コマンド注入は、ここでは明らかな攻撃ベクトルです。コマンドの一部がユーザー入力のときにLinuxサーバーでコマンドを実行する安全な方法

p = os.popen("/usr/bin/passwd " + username, "w") 

などなど:その後、それは何か(Pythonで)などを行い
/^[a-zA-Z0-9]+$/

入力だけであることをユーザ名を義務化することによって検証し、サニタイズされます。

正規表現がない場合、jon; rm -rfのようなユーザー名は、システムまたはpopenにとって致命的なものになります。

はありません私は、そのような悪い入力がシステム/ popen呼び出しにつながっても自分自身を傷つけることができます。 (例えば、subprocessの場合)

これを行うより安全な方法や入力の検証が唯一の防御であることはありますか?コマンドの一部がユーザの入力から来るコマンドを実行する標準的な方法があれば、私はsystem/popenよりも安全なものや、別のアプローチを探していました。

+0

完全なサンドボックスは__LOT__より多くの仕事されている建物、標準のものです。 – orlp

+0

@ nightcracker:いいえ、その場合正規表現の方法は標準的なものではありません。適切なモジュールを使用することが標準的なものです。 –

+1

+1は正しい方法でやりたい。誰かが少なくとも1日に一度はSOに脆弱な注入脆弱性のコードを投稿します。 –

答えて

3

あなた自分で入力を引用することができます:

import pipes 
p = os.popen("/usr/bin/passwd " + pipes.quote(username), 'w') 

os.popenは、しかし、非推奨となり、あなただけのsubprocessモジュールを使用してオフにはるかに良いと思いますのでpipes.quoteは、文書化されていない関数である:

import subprocess 
p = subprocess.Popen(["/usr/bin/passwd", username]) 
+0

パーフェクト、答えに感謝します。サブプロセスは私の最高の推測でした。 – CodeExpress

関連する問題