目的:识别用户上传的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' ;
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' ;
default : throw new \Exception( '文件格式超出了系统识别范围。' );
}
</code>
|
Copier après la connexion
Copier après la connexion
其实我觉得没你想的那么复杂啊,不要太在意后缀这个问题嘛,关键是文件内容。你只要用XML类解析就好咯,比如simplexml
,如果不是规范的XML文档的话是会返回false
的,另外最后也可以将内容全部转换为string
防止文件内代码的执行。