Maison > développement back-end > tutoriel php > 在PHP中如何通过unpack来准确获取文件格式

在PHP中如何通过unpack来准确获取文件格式

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Libérer: 2016-06-06 20:49:57
original
1259 Les gens l'ont consulté

目的:识别用户上传的XML

问题1:用户上传的XML可能存在修改后缀的情况,即本身是脚本语言,却伪装成XML,例如PHP

已解决:那么我通过下面的代码来准确获取文件后缀

问题2:代码是通过fread读取文件头两字节,在识别图片方面非常好使,但是在区别xml和PHP方面却不是很清晰了,因为他们头两个字节都是'',请问如何处理呢?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>            if (($fp = fopen($this->path, 'rb')) == FALSE)

            {

                throw new \Exception('打开文件失败。');

            }

 

            if (!($read = fread($fp, 2)))

            {

                throw new \Exception('文件内容读取为空或读取失败');

            };

 

            $info = unpack('C2chars', $read);

            $code = intval($info['chars1'].$info['chars2']);

            fclose($fp);

 

            switch ($code)

            {

                case 3780: return 'pdf';

                case 5666: return 'psd';

                case 6033: return 'html';

                case 6063: return 'xml';    // php

                default: throw new \Exception('文件格式超出了系统识别范围。');

            }

</code>

Copier après la connexion
Copier après la connexion

回复内容:

目的:识别用户上传的XML

问题1:用户上传的XML可能存在修改后缀的情况,即本身是脚本语言,却伪装成XML,例如PHP

已解决:那么我通过下面的代码来准确获取文件后缀

问题2:代码是通过fread读取文件头两字节,在识别图片方面非常好使,但是在区别xml和PHP方面却不是很清晰了,因为他们头两个字节都是'',请问如何处理呢?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>            if (($fp = fopen($this->path, 'rb')) == FALSE)

            {

                throw new \Exception('打开文件失败。');

            }

 

            if (!($read = fread($fp, 2)))

            {

                throw new \Exception('文件内容读取为空或读取失败');

            };

 

            $info = unpack('C2chars', $read);

            $code = intval($info['chars1'].$info['chars2']);

            fclose($fp);

 

            switch ($code)

            {

                case 3780: return 'pdf';

                case 5666: return 'psd';

                case 6033: return 'html';

                case 6063: return 'xml';    // php

                default: throw new \Exception('文件格式超出了系统识别范围。');

            }

</code>

Copier après la connexion
Copier après la connexion

其实我觉得没你想的那么复杂啊,不要太在意后缀这个问题嘛,关键是文件内容。你只要用XML类解析就好咯,比如simplexml,如果不是规范的XML文档的话是会返回false的,另外最后也可以将内容全部转换为string防止文件内代码的执行。

Étiquettes associées:
php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal