安全文件上传的幻数

时间:2016-08-07 19:38:42

标签: php file security file-upload

  1. Magic-Number检查一个好主意是验证文件还是另一种方式更好。

  2. 这是我的功能想法,检查$_FILES['tmp_name']的Magic-Number,但此时文件加载到服务器上的临时文件夹。我不能在它流到服务器的同时检查它,所以在完全加载之前我不能将加载中止到temp。

  3. // check file type with the first bit of magic numbers
    function is_magic_number_ok($file)
    {
    
        switch ($this->extension) {
            case '.ai':
                $magic_option = array(
                    'magic_number_hex'        => '25504446',
                    'magic_number_bit_length' => 4,
                );
                break;
            case '.bmp':
                $magic_option = array(
                    'magic_number_hex'        => '424D',
                    'magic_number_bit_length' => 2,
                );
                break;
            case '.class':
                $magic_option = array(
                    'magic_number_hex'        => 'CAFEBABE',
                    'magic_number_bit_length' => 4,
                );
                break;
            case '.jpg':
                $magic_option = array(
                    'magic_number_hex'        => 'FFD8',
                    'magic_number_bit_length' => 2,
                );
                break;
            case '.jp2':
                $magic_option = array(
                    'magic_number_hex'        => '0000000C6A5020200D0A',
                    'magic_number_bit_length' => 10,
                );
                break;
            case '.gif':
                $magic_option = array(
                    'magic_number_hex'        => '47494638',
                    'magic_number_bit_length' => 4,
                );
                break;
            case '.tif':
                $magic_option = array(
                    'magic_number_hex'        => '4949',
                    'magic_number_bit_length' => 2,
                );
                break;
            case '.png':
                $magic_option = array(
                    'magic_number_hex'        => '89504E47',
                    'magic_number_bit_length' => 4,
                );
                break;
            default:
                return false;
    
        }
    
        // get the bit limited file length and convert to HEX
        $file_bin_stream = file_get_contents($file, NULL, NULL, 0, $magic_option['magic_number_bit_length']);
    
        $file_hex = strtoupper(bin2hex($file_bin_stream));
    
        if ($magic_option['magic_number_hex'] == $file_hex) {
            echo 'true';
            return true;
        } else {
            echo 'false';
            return false;
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 这不是一个坏主意,但它并不总是奏效。某些文件类型无法正确使用幻数。
  2. 您必须在Web服务器中执行某些操作才能执行此操作。在文件上传之前,PHP代码不会执行。
  3. 最后,php有一个内置的文件信息扩展,可以为你完成大部分工作。更多信息:http://php.net/fileinfo