应用软件安全编程--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

相关文章

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典型应用场景传统

linux打包解压命令方式

《linux打包解压命令方式》文章介绍了Linux系统中常用的打包和解压命令,包括tar和zip,使用tar命令可以创建和解压tar格式的归档文件,使用zip命令可以创建和解压zip格式的压缩文件,每... 目录Lijavascriptnux 打包和解压命令打包命令解压命令总结linux 打包和解压命令打

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]