awanganddong
V2EX  ›  PHP

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

  •  
  •   awanganddong · Aug 16, 2019 · 4364 views
    This topic created in 2488 days ago, the information mentioned may be changed or developed.
    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 replies    2019-10-07 15:07:36 +08:00
    momocraft
        1
    momocraft  
       Aug 16, 2019
    不在 java 也叫魔数

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

    https://www.php.net/manual/zh/function.mime-content-type.php
    nameme
        5
    nameme  
       Aug 16, 2019
    @micookie 对,用这个比较合理
    awanganddong
        6
    awanganddong  
    OP
       Aug 16, 2019
    谢谢各位
    sleepm
        7
    sleepm  
       Aug 16, 2019 via Android
    libmagic
    huxiaohaiyang
        8
    huxiaohaiyang  
       Aug 16, 2019
    包装下 tika.jar
    mingl0280
        9
    mingl0280  
       Aug 17, 2019
    @micookie magic.mime 并不可靠,还是直接读文件头好点。我可以伪造一个后缀 jpg 的 php 文件传上去啊……
    micookie
        10
    micookie  
       Oct 7, 2019
    @mingl0280 magic.mime 不是通过读的文件头吗?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3131 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 14:00 · PVG 22:00 · LAX 07:00 · JFK 10:00
    ♥ Do have faith in what you're doing.