実際、上記の $_FILES[x]['type'] で指摘された人は、非常に簡単かつ任意に変更できます。何も名前を変更したり、他の解析/実行ファイルの名前を変更したりしないようにしてください...内容が解釈されることはありません。また、画像のみを受け入れる場合は、それが実際の画像であることを検証するのに役立つような単純なものを使用できます。ただし、繰り返しになりますが、ユーザーがアップロードしたコンテンツが決して.php
.shtml
readfile()
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 スプーフィングの可能性はほとんどありません。