PHP 判断文件真实后缀, unpack 返回的值与$type_code 做对比有疑惑。在 Java 中管这东西叫魔数。但是$type_code 是另外的值。 那么这个$type_code 具体是什么?

2019-08-16 09:50:06 +08:00
 awanganddong
function getFileType($file){
        $fp = fopen($file, "rb");
        $bin = fread($fp, 2); //只读 2 字节
        fclose($fp);
        $str_info  = @unpack("C2chars", $bin);
        $type_code = intval($str_info['chars1'].$str_info['chars2']);
        $file_type = '';
        switch ($type_code) {
            case 7790:
                $file_type = 'exe';
                break;
            case 7784:
                $file_type = 'midi';
                break;
            case 8075:
                $file_type = 'zip';
                break;
            case 8297:
                $file_type = 'rar';
                break;
            case 255216:
                $file_type = 'jpg';
                break;
            case 7173:
                $file_type = 'gif';
                break;
            case 6677:
                $file_type = 'bmp';
                break;
            case 13780:
                $file_type = 'png';
                break;
            default:
                $file_type = 'unknown';
                break;
        }
        return $file_type;
    }
3588 次点击
所在节点    PHP
10 条回复
momocraft
2019-08-16 09:51:50 +08:00
不在 java 也叫魔数

man file
awanganddong
2019-08-16 11:39:51 +08:00
@momocraft 最大的困惑点就在于 把 7790 类似这些数转化为 16 进制就是文件的魔数吧?
qq316107934
2019-08-16 11:55:17 +08:00
@awanganddong #2 所谓的魔数其实就是文件的头两个字节的内容,一般取 4 个字节甚至 8 个字节根据一些其他规则去匹配合理一些,参考 binwalk 和 https://en.wikipedia.org/wiki/List_of_file_signatures
micookie
2019-08-16 12:15:32 +08:00
php 自带的 mime_content_type 应该是你想要的

https://www.php.net/manual/zh/function.mime-content-type.php
nameme
2019-08-16 14:15:08 +08:00
@micookie 对,用这个比较合理
awanganddong
2019-08-16 14:24:52 +08:00
谢谢各位
sleepm
2019-08-16 16:28:56 +08:00
libmagic
huxiaohaiyang
2019-08-16 18:22:22 +08:00
包装下 tika.jar
mingl0280
2019-08-17 00:13:09 +08:00
@micookie magic.mime 并不可靠,还是直接读文件头好点。我可以伪造一个后缀 jpg 的 php 文件传上去啊……
micookie
2019-10-07 15:07:36 +08:00
@mingl0280 magic.mime 不是通过读的文件头吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/592365

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX