Я хочу создать сценарий загрузки и определить несколько разрешенных типов файлов для загрузки, чтобы предотвратить хитрость путем переименования расширения файла. Я использую этот массив: PHP / Mime Types — Список типов пантомимы, доступных публично?
сначала он проверяет, разрешено ли расширение файла (например, .xsl), затем он использует finfo, чтобы получить mimtype для проверки с этим массивом, чтобы узнать, соответствует ли mimetype расширению.
Я загрузил файл .xsl, finfo повторно запускает тип файла как application / octet-stream, но этот массив для расширения xsl возвращает application / x-msexcel, поэтому он не будет равен и не будет проверен.
Должен ли я на самом деле забыть о совпадении mimetype с валидатором расширения имени файла для скрипта, и я должен просто проверить расширения файла? или что мне делать?
В основном вы делаете это правильно. Вы никогда не должны полагаться на заголовки 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
}
Других решений пока нет …