Я могу нормально загружать изображения, но когда я меняю типы из 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." }
Не используйте параметр ['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"; }
в$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"; }
Одно из ваших условий не работает. Проверьте значение mime-типа для ваших файлов.
Попробуйте использовать приложение / pdf, а не текст / pdf. Обратитесь к правильному типу MIME для файлов PDF
Вы можете использовать
$_FILES['filename']['error'];
Если возникает какой-либо тип ошибки, он возвращает «ошибка» еще 1,2,3,4 или 1, если это сделано
1: если размер файла превышает лимит … Вы можете найти другие варианты по googling
Для приложения / msword и application / vnd.ms-excel, когда я удалил ограничение размера:
($_FILES["file"]["size"] < 20000)
… он работал нормально.