Подтвердить что ты не робот

Загрузить DOC или PDF с помощью PHP

Я могу нормально загружать изображения, но когда я меняю типы из image/jpg, image/gif на application/msword и application/pdf, это не работает. Вот мой код. Точный же код работает для изображений, но для загрузки документов и pdf он выводит "Invalid File". Что здесь происходит? Мой файл составляет всего около 30 кбайт и находится под лимитом размера файла.

$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."
}
4b9b3361

Ответ 1

Не используйте параметр ['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. также тривиально вставлять данные пути в это имя файла, которое вы затем слепо используете. Это означает, что вредоносный удаленный пользователь может писать на ЛЮБОЙ файл на своем сервере, что они знают путь, плюс новые файлы для установки.

Ответ 2

Пожалуйста, добавьте правильные типы 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].');
}

Ответ 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";
}

Ответ 5

Вы можете использовать

$_FILES['filename']['error'];

Если возникает какой-либо тип ошибки, он возвращает 'error' else 1,2,3,4 или 1, если сделано

1: если размер файла превышает лимит... Вы можете найти другие варианты с помощью googling

Ответ 6

Для приложения /msword и application/vnd.ms-excel, когда я удалил ограничение размера:

($_FILES["file"]["size"] < 20000)

... он работал нормально.