考慮して注意する必要があること:
ファイル拡張子: Webサーバーは、ファイル拡張子を使用して、クライアントに送信されるMIMEタイプを判別します。許可する拡張機能のホワイトリストを使用する必要があります。あなたの場合、これは画像拡張になります。
LFI: Matchuがすでに述べたように、ローカルファイルのインクルードが問題になる可能性があります。アプリケーションに動的インクルードがある場合、これにより任意のファイルをインクルードできます。include($_GET['myfile']);
PHPが任意に実行される可能性があります。したがって、 basename()を使用してそのようなインクルードを保護する必要があります。これは、画像にコメントが埋め込まれている可能性があるため、画像でも発生する可能性があります。
MIME-Type-Detection:これは実際にはあまりよく知られておらず、それに関する情報はあまりありません。IE <8には、MIME-Type-Detectionと呼ばれる機能があり、Content-Typeがコンテンツと一致しない場合、最初の256バイトを調べてタイプを推測しようとします。つまり、上部にコメントが付いたimage.gifというPNGファイルがある場合<script>alert('hello');</script>
、IE <8はそれがHTMLであると見なし、JavaScriptを実行して、XSS攻撃を引き起こします。
画像のこの問題を防ぐために、WillihamTotlandが述べたアプローチを使用できます。getimagesize()を使用して、画像が有効かどうかを検出し、拡張子がタイプと一致することを確認することをお勧めします。
$image_filename = 'uploaded_image.gif';
$image_extension = substr(strrchr($image_filename, '.'), 1);
$mime_mapping = array('png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg');
$info = getimagesize($image_filename);
if (!$info) {
exit('not an image');
}
if ($info['mime'] != $mime_mapping[$image_extension]) {
exit('wrong extension given');
}
// all checks passed
// image can be saved now
この問題について書かれた記事がここにあります。