ここで新しい人は、簡単な解決策で何が達成されるべきか質問します。ファイルアップロードサーバー側を検証する - PHPで画像のみを許可する
私はたくさんのコードを試しました。私はgetimagesizeのファイルストリームを取得し、クラッシュすることなく他のものを動作させることができるようです。
私は、アップロードされたファイルを制限して画像ファイルだけで悪くないようにする必要がある古いプロジェクトを取り除いています。
このコードはいつもここで私に何
$imageinfo = getimagesize($_FILES['bf_file'][$key]['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
alert ("Sorry, we only accept GIF and JPEG images");
exit;
}
かかわらず、エラーメッセージを与えるブラックリストの努力である
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".js", ".shtml", ".pl" ,".py"
,".txt", ".doc");
foreach ($blacklist as $file)
{
if(preg_match("/$file\$/i", $_FILES['bf_file'][$key]['tmp_name']))
{
alert "ERROR: Uploading executable files Not Allowed\n";
exit();
}
}
ここで別のgetimagesizeは、これらのそれぞれに
$size = getimagesize($_FILES[bf_file][$key][tmp_name]);
$fp = fopen($_FILES[bf_file][$key][tmp_name], "rb");
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp);
continue;
} else
// error
alert("Inappropriate file type");
ですファイルがアップロードされているかどうかにかかわらずエラーメッセージが表示されます。
これらのコントロールをファイルのどこかに配置するだけで、アップロードされたファイルがチェックに合格すると、すべてがアップローダとして渡され、他のすべての機能はこれらのリミッタとチェックの恩恵を受けることなく行われます。
また、ファイルをアップロードする必要はありません。件名、本文、ファイルアップロードの3つのフィールドがあります。件名と本文のみがデータを持つ必要があり、現在は機能しています。
ご協力いただきますようお願い申し上げます。
おかげで、
ジェームズ
'$ key'の値は何ですか?何が含まれていても、ずっと前からPHPの作者の中には*プレミアム*の愚かさのため、あなたは '$ _FILES ['bf_file'] ['tmp_name'] [$ key]'を参照する必要があります'$ _FILES ['bf_file'] [$ key] ['tmp_name']'のいずれかです。また、 'getimagesize()'がこれを行う唯一の賢明な方法であることに注意してください。コメントが私に与える少量の空間で、あなたのブラックリストアプローチに間違っていることを説明することさえできません。 – DaveRandom
これは1つです:あなたのpreg_matchは複数行ではないので、空白の攻撃に対して脆弱です。ブラックリストではなく、ホワイトリストを使用する理由の1つ。また、イメージキャンバスからピクセルデータをコピーする必要があります。ファイルをそのまま保存すると、悪意のあるユーザーが埋め込みサーバーサイドスクリプトを含むイメージファイルをアップロードする可能性があります。 – Cheekysoft
@Cheekysoft、 'index.php5'(存在するかもしれない)、' index.php.fr'([content negotiation](http://httpd.apache.org/docs/current/content-negotiation.html) ) – xfix