上传文件功能的安全风险很高,为了防范攻击,最基本的安全工作就是验证文件类型是否为系统允许的
简单的通过文件后缀来判断文件类型很不可靠,需要用更安全的方式
很多类型的文件,起始几个字节的内容是固定的,所以根据这几个字节的内容就可以确定文件类型,这几个字节被成为魔数
用魔数来防范文件上传攻击的原理非常简单,读取上传文件的前28个字节,转为十六进制,与魔数对比,就可以判断此文件是否为允许的文件类型
常用文件类型的魔数
JPEG - FFD8FF
PNG - 89504E47
GIF - 47494638
BMP - 424D
PDF - 255044462D312E
ZIP - 504B0304
RAR - 52617221
WAV - 57415645
AVI - 41564920
下面是java读取文件头的示例代码
byte[] b = new byte[28];
InputStream is = new FileInputStream(file_path);
is.read(b,0,28);
is.close();
String hex = bytes2hex(b);
String fileHead = hex.toUpperCase();
此方法可以更为严格的验证文件类型,降低文件上传漏洞风险,但不一定绝对安全,安全要求更高的话,建议使用资源服务器,可以参考 “web安全 - 文件上传漏洞 ”