在网站平台上公开提供上传功能给用户使用会带来很高的安全风险,黑客通常会把一些木马文件伪装成图片文件上传到服务器执行,攻击和破坏系统。
如果程序员只是简单的获取所传文件的后缀来判断是否允许上传,实际是不可靠;一些常见类型的文件,实际开始几个字节内容是固定的,如果我们利用这些字节内容来确定文件类型,则更加可靠,这些字节所说的魔数。
一些常见文件的魔数如下:
JPEG - FFD8FF
PNG - 89504E47
GIF - 47494638
BMP - 424D
PDF - 255044462D312E
ZIP - 504B0304
RAR - 52617221
WAV - 57415645
AVI - 41564920
下面是一个JAVA读取魔数的例子,要做的就是在程序中读取上传文件的前28个字节并转为十六进制,与上面魔数列表对比,从而判断文件的真实类型。
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();