2

Railsコントローラーでは、ユーザーが入力してシス​​テムコマンドを実行するURLを取得しますwget

system("wget #{url}")

ユーザーがのようなものwww.google.com && rm -rf .を入力すると、コントローラーがコマンドを実行する可能性があります。

system("wget www.google.com && rm -rf .")

すべてを削除します。この種の攻撃をどのように防ぐ必要がありますか?ユーザーが私のシステムに害を及ぼすために他に何を入れることができるかわかりません。

4

3 に答える 3

3

このスレッドごと:

スクリプトに引数を個別に渡すことで、シェルの拡張を回避できます。

system("/bin/wget", params[:url])

Kernel#systemのドキュメントによると、このフォームはシェルを呼び出しません。のような構造はシェル構造であるため、この形式を使用すると、paramは文字通り引数として&&に渡されます。/bin/wget

とはいえ、それでも入力に疑いを持ち、可能な場合はサニタイズし、可能であれば、非特権(またはより良いのは投獄された)ユーザーとして実行します。

于 2012-11-12T03:03:03.157 に答える
2

URLのコンテンツを取得するだけの場合は、「システム」やサーバー上でコマンドを実行するその他の手段の使用を完全に回避することをお勧めします。

Httpartyなどのhttpクライアントを使用して、URLコンテンツをフェッチできます。

response = HTTParty.get("#{url}")

于 2012-11-12T03:19:35.917 に答える
2

コマンドを&&(または、、;または|)と結合することはシェル機能であり、wgetそれ自体が理解できるものではありません。コマンドラインをシェルに渡す関数(system()多くの言語の関数など)を使用している場合は、危険にさらされます。wget(シェルを実行してコマンドラインを与えるのではなく)プログラムを直接実行する場合、その特定の攻撃のリスクはありません。

ただし、攻撃者は、ファイルを上書きする不正使用wgetのオプションなど、他のことを行う可能性があります。-Oまったく使用しない方がよいでしょうwget。ファイルをダウンロードすることが目標である場合は、HTTPライブラリを使用して、独自のプログラムのコードで直接ダウンロードしてみませんか。

于 2012-11-12T02:57:45.857 に答える