不同类型文件的魔术数字

前言

在Web项目中,用户上传的文件可能是用户恶意篡改的病毒文件,所以为了避免这种情况,需要对文件的后缀名进行过滤.

通过对后缀名的判断只能够简单的验证文件,如果用户恶意更改了文件的后缀名,这种判断就不起作用了.所以还需要对文件的字节进行验证,每一个文件都有自己的魔术数字.也就是在一个文件的开头部分的字节码,用winhex-19.8(下载下来之后有个木马文件,删除掉就可以,不影响使用)查看一个文件的字节码,就能够知道该类型文件的魔术数字.通过判断魔术数字,就能够起到验证文件的作用.

以下程序通过HashMap存储了后缀名和字节码,实现了对上传文件的验证.

FileType为验证的主方法,在FileUtil中只是控制文件上传.大家可以拿去做个参考.

对于图片类型,通过判断图片的宽和高是否有0来实现对文件的验证.

FileType.java

package com.mbyte.easy.util;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

/**
 * @Description : 读取文件的后缀名
 *
 * @author : 申劭明
 * @date : 2019/9/2 19:42
*/
public class FileType
{
    /**
     * key是文件尾缀,value是文件的魔术数字
     */
    public final static Map<String, String> FILE_TYPE_MAP = new HashMap<>();

    private FileType(){}
    static{
        //初始化文件类型信息
        getAllFileType();
    }

    /**
     * @Description : 用静态方法初始化FILE_TYPE_MAP
     *
     * @author : 申劭明
     * @date : 2019/9/2 19:41
    */
    private static void getAllFileType()
    {
        //图片文件
        FILE_TYPE_MAP.put("jpg", "FFD8FF");
        FILE_TYPE_MAP.put("png", "89504E47");
        FILE_TYPE_MAP.put("gif", "47494638");
        FILE_TYPE_MAP.put("tif", "49492A00");
        FILE_TYPE_MAP.put("bmp", "424D");
        FILE_TYPE_MAP.put("dwg", "41433130");

        FILE_TYPE_MAP.put("html", "68746D6C3E");
        FILE_TYPE_MAP.put("rtf", "7B5C727466");
        FILE_TYPE_MAP.put("xml", "3C3F786D6C");
        FILE_TYPE_MAP.put("zip", "504B0304");
        FILE_TYPE_MAP.put("rar", "52617221");
        //Photoshop (psd)
        FILE_TYPE_MAP.put("psd", "38425053");
        //Email [thorough only] (eml)
        FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A");
        //Outlook Express (dbx)
        FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F");
        //Outlook (pst)
        FILE_TYPE_MAP.put("pst", "2142444E");
        //MS Word
        FILE_TYPE_MAP.put("xls", "D0CF11E0");
        //MS Excel 注意:word 和 excel的文件头一样
        FILE_TYPE_MAP.put("doc", "D0CF11E0");
        //MS Access (mdb)
        FILE_TYPE_MAP.put("mdb", "5374616E64617264204A");
        //WordPerfect (wpd)
        FILE_TYPE_MAP.put("wpd", "FF575043");
        FILE_TYPE_MAP.put("eps", "252150532D41646F6265");
        FILE_TYPE_MAP.put("ps", "252150532D41646F6265
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值