Проверка типа файла PHP

Хорошо, вот мой код для загрузки файлов

$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)

Есть несколько «безопасных» способов проверки загруженных файлов:

1. Проверьте расширение и сравните его с белым списком.

Это пример в вопросе, но я бы хотел написать полное решение. (Обычная ошибка, чтобы проверить только первые мысли после . , Потому что могут быть имена файлов вроде: 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 и все, что находится в конфигурации сервера.

2. Переименуйте файл и отпустите расширение.

Это еще один хороший способ, но, возможно, вы хотите сохранить исходное имя файла, расширение и тип 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'; }