Как проверить тип файла по его расширению?

Я хочу создать сценарий загрузки и определить несколько разрешенных типов файлов для загрузки, чтобы предотвратить хитрость путем переименования расширения файла. Я использую этот массив: PHP / Mime Types — Список типов пантомимы, доступных публично?
сначала он проверяет, разрешено ли расширение файла (например, .xsl), затем он использует finfo, чтобы получить mimtype для проверки с этим массивом, чтобы узнать, соответствует ли mimetype расширению.

Я загрузил файл .xsl, finfo повторно запускает тип файла как application / octet-stream, но этот массив для расширения xsl возвращает application / x-msexcel, поэтому он не будет равен и не будет проверен.

Должен ли я на самом деле забыть о совпадении mimetype с валидатором расширения имени файла для скрипта, и я должен просто проверить расширения файла? или что мне делать?

1

Решение

В основном вы делаете это правильно. Вы никогда не должны полагаться на заголовки MIME-типа, которые отправляются из формы загрузки, потому что вы можете легко подделать это, или его нет, тогда вы часто будете получать application/octet-stream заголовок.

Так что было бы хорошим способом проверить, соответствует ли расширение файла разрешенному типу mime для этого расширения файла.

Я видел, как вы связали этот список Вот. Это, безусловно, хороший список, но не очень пригодный для использования с php, потому что в массиве слишком много оверриденов, например:

$mimeTypes = array(
'xlm' => 'application/vnd.ms-excel',//overridden
'xlm' => 'application/x-excel',
'xls' => 'application/excel',//overridden
'xls' => 'application/vnd.ms-excel'
);

var_dump( $mimeTypes );

Это выведет только два значения вместо четырех, вы должны использовать массив следующим образом:

$mimeTypes = array(
'xlm' => array( 'application/vnd.ms-excel', 'application/x-excel' ),
'xls' => array( 'application/excel', 'application/vnd.ms-excel' ),
'txt' => array( 'text/plain' )
);

var_dump( $mimeTypes );

Таким образом, вы можете просто проверить MIME-тип с in_array () если у вас уже есть расширение файла.

Это базовый пример, который вы могли бы решить. НОТА: Это не рабочий пример, но я думаю, вы знаете, где я хочу указать:

// you have your file, you said it´s excel but you uploaded it with extension txt
$filepath = "excel.txt";

if( strpos( $filepath, '.' ) === false ) {
// no file extension
// return ?
}
// get the file extension
// well there is surely a better way
$filenameParts = explode( ".", $filepath );
$fileExt = array_pop( $filenameParts );// return the las element of the array and REMOVES it from the array

// your fopen stuff to get the mime type
// ok let´s say we are getting back the follwing mime type
$fileMimeType = 'application/vnd.ms-excel';

// now check if filextension is in array and if mimetype for this extension is correct
if( isset( $mimeTypes[$fileExt] ) && in_array( $fileMimeType, $mimeTypes[$fileExt] ) ) {
// file extension is OK AND mime type matches the file extension
} else {
// not passed unknown file type, unknown mime type, or someone tricked you
// your excel.txt should end up here
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]