我有一个脚本可以从数据生成一个 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
开头的都是图片。完成!
我不是特别熟悉这种格式,但它似乎甚至看起来 不是 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/