PHP生成的JSON文件具有application / octet-stream mime类型

时间:2017-01-06 09:54:10

标签: php json mime-types

我有一个从数据生成JSON文件的脚本。 我有第二个脚本,它从目录中读取文件,只接受JSON文件并将它们插入到DB中。

问题是第二个脚本从我生成的文件而不是application/json中检测到“application / octet-stream”MIME类型

我不想允许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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

fileinfo扩展(与file Unix命令类似的工具)基本上搜索数据库中定义的签名(称为“魔术”)。如果我没有错,PHP的魔术数据库目前被编译到扩展二进制文件中,因此您无法查看它,但您可能在系统中有一个类似的数据库。我在C:\Apache24\conf.magic有Apache,这是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
}