如何确定压缩文件是否包含可执行文件

时间:2015-07-23 13:15:12

标签: java spring security file-type

我需要使用我的Java - Spring Web应用程序上传文件。

在上传文件时,我需要检查要上传的文件类型。根据我的要求,我需要允许上传压缩文件。

要处理安全问题,如果我有恶意文件类型列表,则应该对可执行文件或不需要的文件类型筛选zip文件。

请建议我如何使用java来了解zip文件的内容类型。

3 个答案:

答案 0 :(得分:0)

我建议尝试以下方法:

  1. 使用Zip文件系统提供程序使用NIO.2文件API访问ZIP文件:https://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html
  2. 遍历文件树:https://docs.oracle.com/javase/tutorial/essential/io/walk.html(还有支持Java SE 8 Streams的方法)。
  3. 根据检查,例如。使用Files.isExecutable

答案 1 :(得分:0)

您主要担心的是,zip文件是否包含个文件。为此,您可以搜索zip文件的内容以读取文件名;从文件名中可以​​找到哪个文件是文件。

public static void printFileList(String filePath){

    FileInputStream fis = null;
    ZipInputStream zipIs = null;
    ZipEntry zEntry = null;
    try {
        fis = new FileInputStream(filePath);
        zipIs = new ZipInputStream(new BufferedInputStream(fis));
        while((zEntry = zipIs.getNextEntry()) != null){
            System.out.println(zEntry.getName());
        }
        zipIs.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

<强>输入

C:\\Users\\Desktop\\New.zip

输出

New/contactsManager
New/log.txt
New/timesheet.PNG

从输出文件名中可以​​找到.exe文件。

答案 2 :(得分:0)

在其他任何事情之前,您需要重写该文件。 Zip文件“令人惊讶”。阅读内容,检查,写出新的档案。这并不罕见,并进一步重写所包含的文件(例如,网站通常会重写用户上传图像)。

您应注意目录遍历攻击和拒绝服务(zip炸弹)的其他事项。

通常你应该列入白名单,而不是黑名单。可能你想检查文件扩展名(并且可能检查没有更多的点)和幻数(通常是前四个字节)同意。 UNIX命令魔法的实现可能对您有所帮助。

有一些特点。例如,zip文件本身可以从后面读取(参见GIFAR)。有些程序会忽略无效输入并跳过它能理解的东西。可能一个目标程序会做一个额外的解缠层,比如一个枪口。