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

标签 php json mime-types

我有一个脚本可以从数据生成一个 JSON 文件。 我有第二个脚本,它从目录中读取文件以仅获取 JSON 文件并将它们插入数据库。

问题是第二个脚本从我生成的文件中检测到“application/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
        }
    }
}

最佳答案

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 等)。它通常不会添加有值(value)的信息,它是保持更新的另一个标志,而且特别不可移植(将您的文件复制到拇指驱动器,它们就消失了)。

  • 它仍然不是安全功能。如果我可以伪造文件内容,是什么阻止我伪造 MIME 类型?


那么,你能做什么?最好的选择是:什么都不做。

只需将文件解析为 JSON 并检测是否失败。无论如何你都需要这样做,它会告诉你你需要做的一切。 JSON 只是纯文本数据。也许添加一些检查以防止非常大的文件(同样,无论如何您都应该在文件上传时这样做)并添加一个 $depth 检查,但仅此而已。

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

关于php - PHP 生成的 JSON 文件具有 application/octet-stream mime 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41503057/

相关文章:

javascript - 将 JSON 字符串解析为数组

python - .zip 文件在使用 gmail api 发送并使用 zlib 压缩时损坏

objective-c - 我应该如何用电子邮件发送我自己格式的文件,我应该怎么做才能在我自己的 iOS 5 应用程序中打开它?

PHP 图像生成器因任何典型原因而失败

php - 在 Active Collab API 中获取分页结果

php - mysqli_fetch_assoc - 如果同时更改数据会怎样?

json - 使用 jq 以人类可读格式打印 JSON 数组

php - 如何从php字符串中获取图片src属性值?

javascript - 正则表达式替换 JS 文件中的部分字符串

ruby-on-rails - 如何将值合并到 Rails 查询 as_json