1

ユーザーが入力した $imageurl を受け取り、次のことを行う PHP アプリがあります。

exec('convert "'.$url.'" -thumbnail 80x500 "images/out.jpg"');

明らかに、ユーザーが任意のコードを実行するのを防ぐために、これに関していくつかの予防策を講じる必要があります。たとえば、ユーザーが に設定$urlした場合、";rm -rf *;"まったくダメです。

"したがって、まず、何を入力しても、入力が へのパラメーターであることから逃れることができないように、フィルターで除外する必要がありますconvert;しかし、私も同様に除外する必要がありますか? セミコロンが含まれる URL を見たことがあります...ここではセミコロンが本当に危険ですが、フィルタで除外し"ても安全ですよね? しかし、URLに含めること"はできますか? 他に注目すべきキャラクターはいますか?

文字を除外する代わりに、文字をエスケープする必要があるかもしれません。では、シェルによって特別に解釈されたすべての文字をエスケープしようとする必要がありますか? "または、二重引用符で囲まれているため、他のすべてが一種の「事前エスケープ」されているため、単にエスケープしますか?

とりとめのない混乱で申し訳ありません。私はこれが初めてで、安全を確保したいのです!

ありがとう、
マラ

4

3 に答える 3

3

URL が URL であることを確認したい場合は、filter_varを使用します。

filter_var($url, FILTER_VALIDATE_URL);

example.com/foo?;rm -rfこれは、まだ有効な URL であるにもかかわらず、人々が URL を提供することを妨げるものではありません。rmこれが実行されるかどうかはわかりませんが、URL を確認しparse_url()てクエリ部分を省略することもできます。

一般に、これらも確認することをお勧めします。

  • escapeshellarg() - シェル引数として使用するストリングをエスケープする
  • escapeshellcmd() - シェルのメタ文字をエスケープする

また、ユーザー入力の保護に関する PHP マニュアルも参照してください。

于 2010-01-14T10:35:33.017 に答える
2

escapeshellarg関数を使用できます。

于 2010-01-14T10:36:25.917 に答える
0

正規表現を使用して、$url に有効なファイル名文字 ("(\w\.\-/){1,256}" など) のみが含まれるようにします。さらに、ユーザーがアップロードするファイルの名前をランダムなファイル名、または少なくともホワイトリストに登録されたファイル名 (つまり、同じ正規表現を使用) に変更していると思います。sha1 .ext またはmd5 .ext は使いやすいフォーマットです。

于 2010-02-25T16:47:15.183 に答える