在PHP中如何通过unpack来准确获取文件格式
程序员文章站
2022-04-18 19:41:33
...
目的:识别用户上传的XML
问题1:用户上传的XML可能存在修改后缀的情况,即本身是脚本语言,却伪装成XML,例如PHP
已解决:那么我通过下面的代码来准确获取文件后缀
问题2:代码是通过fread读取文件头两字节,在识别图片方面非常好使,但是在区别xml和PHP方面却不是很清晰了,因为他们头两个字节都是'',请问如何处理呢?
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('文件格式超出了系统识别范围。');
}
回复内容:
目的:识别用户上传的XML
问题1:用户上传的XML可能存在修改后缀的情况,即本身是脚本语言,却伪装成XML,例如PHP
已解决:那么我通过下面的代码来准确获取文件后缀
问题2:代码是通过fread读取文件头两字节,在识别图片方面非常好使,但是在区别xml和PHP方面却不是很清晰了,因为他们头两个字节都是'',请问如何处理呢?
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('文件格式超出了系统识别范围。');
}
其实我觉得没你想的那么复杂啊,不要太在意后缀这个问题嘛,关键是文件内容。你只要用XML类解析就好咯,比如simplexml
,如果不是规范的XML文档的话是会返回false
的,另外最后也可以将内容全部转换为string
防止文件内代码的执行。