我有一个从数据生成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
}
}
}
答案 0 :(得分:0)
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 ......的情况)。它通常不会添加有价值的信息,它是保持更新的另一个标记,它特别不便携(将文件复制到拇指驱动器,它们已经消失)。
它仍然不是安全功能。如果我可以伪造文件内容,是什么阻止我伪造MIME类型?
那么,你能做什么?最好的选择是:什么都没有。
将文件解析为JSON并检测它是否失败。无论如何你需要这样做,它告诉你你需要做的一切。 JSON只是纯文本数据。也许添加一些检查以防止非常大的文件(再次,你应该在你的文件上传中执行它)并添加$depth
检查,但这就是全部。
if (json_decode($s_file_path, true, 32)!==null || json_last_error()!==JSON_ERROR_NONE) {
// Valid JSON
}