Хорошо, вот мой код для загрузки файлов
$ext_whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg'); if(in_array($ext, $ext_whitelist)) { $uniqid_file = uniqid('', true)."_".$file['name']; $lokacija = $folder . "/" . $uniqid_file; $encoded_uniqid_file = base64_encode($uniqid_file); move_uploaded_file($file['tmp_name'], $lokacija); $base_url= base_url("forms/fdownload/$encoded_uniqid_file/$path"); $form_data[$key] = "<a href=".$base_url.">$uniqid_file </a>"; }
Это проверяет расширение файла, поэтому некоторые могут переименовать файл, может ли кто-нибудь помочь мне проверить тип файла?
Приведенный комментарий, я напишу немного больше как ответ.
Проверка Mimetype – хорошая вещь, если вы хотите узнать тип файла, но он небезопасен, если вы хотите разрешить / запретить файлы при загрузке, потому что очень легко подделать mimetype. Просто попробуйте, вы можете изменить его с помощью прокси-сервера или создать простой образ, а затем добавить в php-код и переименовать его в .php. Если вы только проверите тип mimetype, вы можете загрузить этот .php-файл и запустить его на сервере.
Если вы загружаете .jpg с кодом php в нем, все в порядке, сервер не будет проталкивать его через парсер php. (За исключением случаев, когда вы меняете конфигурацию по умолчанию. (Apache: AddType, nginx: AddHandler)
Есть несколько «безопасных» способов проверки загруженных файлов:
Это пример в вопросе, но я бы хотел написать полное решение. (Обычная ошибка, чтобы проверить только первые мысли после .
, Потому что могут быть имена файлов вроде: something.txt.php, поэтому всегда проверяйте последний постфикс.)
$ext = array_pop(explode(".", $fileName)); $whitelist = array('pdf','doc','doc','mkv','mp4','mpg','mpeg','avi','flv','wma','ogg'); if (in_array($ext, $whitelist) { //OK the extension is good, handle the upload. } else { //Wrong type, add error message. }
Если вы используете что-то вроде этого, будьте осторожны и никогда не разрешайте расширения, такие как .php и все, что находится в конфигурации сервера.
Это еще один хороший способ, но, возможно, вы хотите сохранить исходное имя файла, расширение и тип mimetype. Вы можете хранить их в базе данных!
Для этого решения просто возьмите исходное имя файла, добавьте некоторые случайные данные (потому что, если вы загрузите их в одну папку, и вы trie для загрузки something.jpg 2 раза, это будет плохая идея), а затем сохраните это. Например:
$newName = sha1($fileName.time()); move_uploaded_file($file['tmp_name'], $uploadPath . $newName);
Поскольку файл не имеет расширения, сервер не пытается его запустить. (Но если это, например, изображение, оно будет работать в браузерах, потому что они используют тип mimetype для определения типа, и мы не изменили его.)
Вы можете использовать
жемчужно-файлов mimeinfo
Пример: –
$file_path = '/tmp/temp.jpg'; $mimetype = trim(shell_exec("/usr/bin/mimetype -bi ".escapeshellarg($file_path))); $info = null; if(strpos($mimetype, "video/")===0 || strpos($mimetype, 'x-flash-video') > 0){ $info = 'video'; }elseif(strpos($mimetype, "audio/")===0){ $info = 'audio'; }elseif(strpos($mimetype, "image/")===0){ $info = 'image'; }