1

重複の可能性:
PHP 画像アップロードのセキュリティ チェック リスト

ユーザーが画像をアップロードできるファイルアップロードフォームをWebサイトに設定しています。セキュリティのために、ファイルの名前を変更して保存する前に、画像のサイズと MIME タイプを確認します。

私が心配しているのは、ユーザーがさまざまなファイルを絶えずアップロードしてサーバーを悪用するのを防ぐ方法です。これを防ぐ方法はありますか?ユーザーの IP を ($_SERVER["REMOTE_ADDR"] および $_SERVER["HTTP_X_FORWARDED_FOR"] を介して) 追跡し、アップロードごとにタイムスタンプを付け、アップロードを 1 時間あたり X に制限することを考えていました。フィードバックや提案は大歓迎です。

ありがとう

4

1 に答える 1

1

実際、上記の $_FILES[x]['type'] で指摘された人は、非常に簡単かつ任意に変更できます。何も名前を変更したり、他の解析/実行ファイルの名前を変更したりしないようにしてください...内容が解釈されることはありません。また、画像のみを受け入れる場合は、それが実際の画像であることを検証するのに役立つような単純なものを使用できます。ただし、繰り返しになりますが、ユーザーがアップロードしたコンテンツが決して.php.shtmlreadfile()getimagesize()具体的には、アップロードしたファイルを Web ブラウザ経由でアクセスすることによって実行されます。誰かが有効な JPEG ファイルを作成するのに十分な時間をかけgetimagesize() .php . 遠回りですが、万が一に備える必要があります。:)

他のタイプの悪用に関しては、各 IP が 1 時間/日あたり X バイトまたは合計アップロード (またはその両方) のみを取得するなどの単純なフィルターを使用できます。その制限を超える場合は、reCAPTCHA などの非常に信頼性の高いキャプチャ システムを使用してください。そうすれば、正当なリクエストを見逃すことがなく、乱用を最小限に抑えることができ、画像のアップロードごとにキャプチャを強制することもありません.

さらに、X-FORWARDED-FOR を優先しないでください。私は実際に次のようなコードを見てきました:

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else { 
  $ip = $_SERVER['REMOTE_ADDR'];
}

これは非常に間違っています。X-FORWARDED-FORは、転送プロキシ サーバーから送信することもできます。また、絶対に何からでも送信され、愚か者をだまして自分の IP が実際にはそうではないものであると思い込ませることができます。

REMOTE_ADDR を HTTP_X_FORWARD_FOR と組み合わせて使用​​している限り (そして HTTP_X_FORWARDED_FOR を決して信頼せず、二次的な参照にのみ使用してください)、実際の IP スプーフィングの可能性はほとんどありません。

于 2012-12-05T20:35:47.717 に答える