我可以很好地上传图像,但是当我将类型从 image/jpg、image/gif 更改为 application/msword 和 application/pdf 时,它不起作用。这是我的代码。完全相同的代码适用于图像,但对于上传文档和 pdf,它会输出“无效文件”。这里发生了什么?我的文件只有大约 30kb,远低于此处的文件大小限制。
$allowedExts = array("pdf", "doc", "docx");
$extension = end(explode(".", $_FILES["file"]["name"]));
if ( ( ($_FILES["file"]["type"] == "application/msword") || ($_FILES["file"]["type"] == "text/pdf") )
&& ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts))
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
}
else
{
echo "Invalid file."
}
不要使用['type']
验证上传的参数。该字段是用户提供的,并且可以轻松伪造,从而允许上传任何类型的文件。这同样适用于['name']
参数 - 这是用户提供的文件名。伪造也很简单,因此用户发送nastyvirus.exe
并称之为cutekittens.jpg
.
验证上传的正确方法是使用服务器端 MIME 类型确定,例如通过fileinfo http://php.net/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 最终目标的一部分。将路径数据嵌入到该文件名中也很简单,然后您就可以盲目地使用它。这意味着恶意远程用户可以在您的服务器上他们知道路径的任何文件上乱写,并植入新文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)