2017-01-06 11 views
4

У меня есть сценарий, который генерирует JSON-файл из данных. У меня есть второй скрипт, который читает файлы из каталога, чтобы брать только JSON и вставлять их в БД.JSON файл сгенерирован PHP имеет тип mime приложения/octet-stream

Проблема заключается в том, что второй сценарий определяет «приложение/октет-поток» MIME тип из моих сгенерированных файлов вместо application/json

Я не хочу, чтобы application/octet-stream MIME тип, как это может быть довольно ничего (для причина безопасности: этот второй скрипт загружает весь файл json в каталог (а не только сгенерированные)).

Есть ли в любом случае «установить» тип MIME для файла?

код, который генерирует файл:

if($r_handle = fopen($s_file_name, 'w+')){ 
    fwrite($r_handle, json_encode($o_datas, JSON_HEX_QUOT | JSON_HEX_TAG)); 
    fclose($r_handle); 
    return; 
} 

Код, читать JSON файлы:

$o_finfo = finfo_open(FILEINFO_MIME_TYPE); 
$a_mimes =& get_mimes(); 
if(is_dir($s_dir) && $r_handle = opendir($s_dir)){ 
    while($s_file = readdir($r_handle)){ 
     $s_file_path = $s_dir.$s_file; 
     $s_mime  = finfo_file($o_finfo, $s_file_path); 
     if(!in_array($s_file, array('.', '..')) && in_array($s_mime, $a_mimes['json'])){ 
      // Some code 
     } 
    } 
} 
+3

Нет, вы не можете «установить» тип MIME. Finfo просто * угадывает *, насколько это возможно. «application/octet-stream» в значительной степени означает «dunno, это файл, который я думаю». Какой технический ответ правильный ... – deceze

+0

Если я понимаю вопрос, вы можете установить тип содержимого в 'header()' и 'fopen()' файл в PHP, правильно? –

+0

@SteveKnau: Могу ли я сделать 'header()' then 'fopen()' then 'fwrite()' then 'fclose()'? – VeZoul

ответ

0

В fileinfo расширение (как аналогичные инструменты, такие как команды file Unix), в основном ищет подписи определенных в базе данных (называемой «магия»). Если я не ошибаюсь, волшебная база PHP теперь скомпилирована в двоичный файл расширения, поэтому вы не можете заглядывать в нее, но у вас, вероятно, будет похожая база данных в вашей системе. У меня есть веб-сервера Apache на C:\Apache24\conf.magic и это запись для JPEG:

# JPEG images 
0 beshort  0xffd8  image/jpeg 

Все, что начинается с 0xffd8 картина. Готово!

JPEG file in hex editor

Я не особо знаком с форматом, но он не кажется, даже выглядеть для JSON. И, как вы уже можете догадываться, общая полезность отнюдь не является функцией безопасности. Это просто вспомогательный инструмент для определения того, что может содержать файл. Это очень удобно, если, например, вы восстановили файлы без расширения с поврежденного диска.


MIME-типы классные. Вы устанавливаете application/json, и все знают, что это JSON. Простой и простой, не так ли. Там вы только два предостережения:

  • файловых систем (многие из них на самом деле изобретены до того типов MIME) хранят многие атрибуты файла (имя, дата последнего изменения, права доступа, иногда даже иконки ...), но не типы MIME , (Конечно, есть, вероятно, какая-то академическая файловая система, но это не относится к FAT32, NTFS, ext4 ...). Обычно это не добавляет ценной информации, это еще один токен, чтобы продолжать обновляться, и это особенно не переносится (скопируйте файлы на флэш-накопитель, и они исчезли).

  • Это еще не функция безопасности. Если я могу подделать содержимое файла, что мешает мне подделывать MIME-тип?


Итак, что вы можете сделать? Лучшая альтернатива: ничего.

Просто проанализируйте файл как JSON и определите, не удалось ли оно.Вам все равно нужно это сделать, и он расскажет вам все, что вам нужно. JSON - это просто текстовые данные. Возможно, добавьте некоторые проверки, чтобы предотвратить очень большие файлы (опять же, вы должны делать это в любом случае при загрузке файла) и добавьте отметку $depth, но это все.

if (json_decode($s_file_path, true, 32)!==null || json_last_error()!==JSON_ERROR_NONE) { 
    // Valid JSON 
}