应用软件安全编程--02从 ZipInputStream 安全解压文件

2023-11-01 15:36

本文主要是介绍应用软件安全编程--02从 ZipInputStream 安全解压文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对java.util.ZipInputStream 的输入进行检查可以防止消耗过多的系统资源。解压一个文件,比如 zip、gif或者 gzip编码的 HTTP  内容,可能会消耗过多的资源,并且在压缩率极高的情况下,可能会导 致 zip炸弹的出现。

对于从 ZipInputStream 安全解压文件的情况,示例1给出了不规范用法(Java 语言)示例。示例2 给出了规范用法(Java 语言)示例。

示例1:static  final  int  BUFFER  =  512;/1.public final void unzip(String filename) throws java.io.IOException{FileInputStreamfis = new FileInputStream(filename);ZipInputStreamzis = new ZiplnputStream(new BufferedInputStream(fis));ZipEntry entry;try {while((entry   =   zis.getNextEntry())!=   null){System.out.println("Extracting:"+     entry);int    count;byte data[] = new byte[BUFFER];//  Write  the  files  to  the  diskFileOutputStreamfos = new FileOutputStream(entry.getName());BufferedOutputStreamdest = new BufferedOutputStream(fos,BUFFER);while((count        =        zis.read(data,0,BUFFER))!=- 1){dest.write(data,0,count);dest.flush();dest.close();zis.closeEntry();} finally{zis.close();}

 这个不规范的代码示例没有检查解压一个文件时所消耗的资源。它会允许操作持续进行直至完 成,或者直至本地资源耗尽为止。

示例2:static   final   int   BUFFER   =   512;static final int TOOBIG = 0x6400000;// Max size of unzipped data,100MBstatic   final   int   TOOMANY   =    1024;          // Max number of files//..private String validateFilename(String filename, String intendedDir)throws java.io.IOException {File    f   =   new    File(filename);String  canonicalPath  =  f.getCanonicalPath();File    iD    =    new    File(intendedDir);String  canonicalID=  iD.getCanonicalPath();if  (canonicalPath.startsWith(canonicalID)){return        canonicalPath;}else  {throw new lllegalStateException("File is outside extraction target directory.");public final void unzip(String filename) throws java.io.IOException {FileInputStreamfis = new FileInputStream(filename);ZipInputStreamzis = new ZiplnputStream(new BufferedInputStream(fis));ZipEntry entry;int   entries   =   0;long total  =  0;try {while((entry     =     zis.getNextEntry())!=     null){System.out.println("Extracting:"+         entry);int    count;byte   data[]=  new  byte[BUFFER];// Write the files to the disk, but ensure that the filename is valid,// and that the file is not insanely bigString   name   =   validateFilename(entry.getName(),".");if   (entry.isDirectory()){System.out.println("Creating            directory"+            name);new           File(name),mkdir();continue;FileOutputStreamfos  =  new  FileOutputStream(name);BufferedOutputStreamdest = new BufferedOutputStream(fos, BUFFER);while(total+          BUFFER          <=          TOOBIG          &.&.(count          =          zis.read(data,0,BUFFER))!=- 1){dest.write(data,0,count);total     +=     count;dest.flush();dest.close();zis.closeEntry();entries++;if         (entries          〉TOOMANY){throw new lllegalStateException("Too many files to unzip.");if        (total        〉TOOBIG){throw new IllegalStateException("File being unzipped is too big.");} finally {zis.close();
}

在这个规范的代码示例中,代码在提取条目之前验证每个条目的名称。如果名称无效,那么整个提 取就会被中止。 while 循环中的代码将判断 zip归档中每个条目的文件大小,同时提取条目。如果提取 的条目太大,在本例中为100 MB, 则会抛出异常。代码不要使用ZipEntry.getSize()方法,因为攻击者 可以伪造 ZIP 文档中未压缩的文件的大小。最后,代码还计算压缩包中文件条目的数量,如果超过 1024个条目,则抛出异常。

这篇关于应用软件安全编程--02从 ZipInputStream 安全解压文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/324005

相关文章

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统