V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awanganddong
V2EX  ›  PHP

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

  •  
  •   awanganddong · 2019-08-16 09:50:06 +08:00 · 3725 次点击
    这是一个创建于 1925 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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;
        }
    
    10 条回复    2019-10-07 15:07:36 +08:00
    momocraft
        1
    momocraft  
       2019-08-16 09:51:50 +08:00
    不在 java 也叫魔数

    man file
    awanganddong
        2
    awanganddong  
    OP
       2019-08-16 11:39:51 +08:00
    @momocraft 最大的困惑点就在于 把 7790 类似这些数转化为 16 进制就是文件的魔数吧?
    qq316107934
        3
    qq316107934  
       2019-08-16 11:55:17 +08:00
    @awanganddong #2 所谓的魔数其实就是文件的头两个字节的内容,一般取 4 个字节甚至 8 个字节根据一些其他规则去匹配合理一些,参考 binwalk 和 https://en.wikipedia.org/wiki/List_of_file_signatures
    micookie
        4
    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
        5
    nameme  
       2019-08-16 14:15:08 +08:00
    @micookie 对,用这个比较合理
    awanganddong
        6
    awanganddong  
    OP
       2019-08-16 14:24:52 +08:00
    谢谢各位
    sleepm
        7
    sleepm  
       2019-08-16 16:28:56 +08:00 via Android
    libmagic
    huxiaohaiyang
        8
    huxiaohaiyang  
       2019-08-16 18:22:22 +08:00
    包装下 tika.jar
    mingl0280
        9
    mingl0280  
       2019-08-17 00:13:09 +08:00
    @micookie magic.mime 并不可靠,还是直接读文件头好点。我可以伪造一个后缀 jpg 的 php 文件传上去啊……
    micookie
        10
    micookie  
       2019-10-07 15:07:36 +08:00
    @mingl0280 magic.mime 不是通过读的文件头吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:35 · PVG 18:35 · LAX 02:35 · JFK 05:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.