使用PHP上传DOC或PDF
我能够上传图像,但是当我从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,加上正确的上传成功检查,而不是:
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的最终目标的一部分。 将路径数据嵌入到该文件名中也是微不足道的,然后您就盲目地使用它。 这意味着恶意的远程用户可以在他们知道路径的服务器上的任何文件上涂写,并添加工厂新文件。
请将正确的MIME类型添加到您的代码中 - 至少这些是:
.jpeg -> image/jpeg
.gif -> image/gif
.png -> image/png
这里可以找到mime类型的列表。
此外,简化代码的逻辑并报告错误编号以帮助第一级支持人员追踪问题:
$allowedExts = array(
"pdf",
"doc",
"docx"
);
$allowedMimeTypes = array(
'application/msword',
'text/pdf',
'image/gif',
'image/jpeg',
'image/png'
);
$extension = end(explode(".", $_FILES["file"]["name"]));
if ( 20000 < $_FILES["file"]["size"] ) {
die( 'Please provide a smaller file [E/1].' );
}
if ( ! ( in_array($extension, $allowedExts ) ) ) {
die('Please provide another file type [E/2].');
}
if ( in_array( $_FILES["file"]["type"], $allowedMimeTypes ) )
{
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
}
else
{
die('Please provide another file type [E/3].');
}
$folder = "Resume/";
$temp = explode(".", $_FILES["uploaded"]["name"]);
$newfilename = round(microtime(true)).'.'. end($temp);
$db_path ="$folder".$newfilename ;
$listtype = array(
'.doc'=>'application/msword',
'.docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.rtf'=>'application/rtf',.
'.pdf'=>'application/pdf');
if ( is_uploaded_file( $_FILES['uploaded']['tmp_name'] ) )
{
if($key = array_search($_FILES['uploaded']['type'],$listtype))
{if (move_uploaded_file($_FILES['uploaded'] ['tmp_name'],"$folder".$newfilename))
{
include('connection.php');
$sql ="INSERT INTO tb_upload
(filePath) VALUES ('$db_path')";
}
}
else
{
echo "File Type Should Be .Docx or .Pdf or .Rtf Or .Doc";
}
链接地址: http://www.djcxy.com/p/8175.html