不要使用[‘type’]参数验证上传.该字段是用户提供的,并且可以被简单地伪造,允许任何类型的文件被上传. [‘name’]参数也是一样 – 用户提供的文件名称.伪造也是微不足道的,所以用户发送nastyvirus.exe并调用它cutekittens.jpg.
验证上传的正确方法是使用服务器端MIME类型确定,例如通过fileinfo,加上正确的上传成功检查,你不:
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error " . $_FILES['file']['error']);
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$ok = false;
switch ($mime) {
case 'image/jpeg':
case 'application/pdf'
case etc....
$ok = true;
default:
die("Unknown/not permitted file type");
}
move_uploaded_file(...);
您还使用用户提供的文件名作为move_uploaded_files的最终目标的一部分.将路径数据嵌入到该文件名中也是微不足道的,然后您将盲目使用.这意味着恶意的远程用户可以在您的服务器上的任何文件上涂抹他们知道的路径,以及植物新文件.