《Java安全编码标准》一2.5 IDS04-J限制传递给ZipInputStream的文件大小

简介: 本节书摘来自华章出版社《Java安全编码标准》一书中的第2章,第2.5节,作者 (美)Fred Long,Dhruv Mohindra,Robert C. Seacord,Dean F. Sutherland,David Svoboda,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.5 IDS04-J限制传递给ZipInputStream的文件大小

通过对java.util.ZipInputStream的输入进行检查,可以防止消耗过多的系统资源。当资源使用大大多于输入数据所使用的资源的时候,就会出现拒绝服务问题。当需要解压一个小文件,比如zip、gif或者gzip编码的HTTP内容,会消耗过多的资源时,并且在压缩率极高的情况下,Zip算法的实现本身就会导致zip炸弹(zip bomb)的出现。
zip算法能产生很高的压缩比率?[Mahmoud 2002]。 图2-1显示了一个文件可以从148MB压缩到590KB,压缩比率高达200:1。这个文件包含了多次出现的重复数据,比如交替出现的字符a和b。如果输入数据符合压缩算法的要求,或者可以使用更多的输入数据,或者可以使用其他的压缩方法,甚至还能达到更高的压缩比例。

image

在zip文件中的任何数据,如果其解压后的文件大小超出了一个特定的限制,那么就不应该将它们解压。而这个限制实际上取决于平台的能力。
这条规则是更普遍的规则MSC07-J的一个特例。

2.5.1 不符合规则的代码示例

下面是一个不符合规则的代码示例,它不能检查解压一个文件时所消耗的资源。它会允许操作完成,或者直至本地资源耗尽为止。
static final int BUFFER = 512;

// ...

// external data source: filename
BufferedOutputStream dest = null;
FileInputStream fis = new FileInputStream(filename);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
??System.out.println("Extracting: " + entry);
??int count;
??byte data[] = new byte[BUFFER];
??// write the files to the disk
??FileOutputStream fos = new FileOutputStream(entry.getName());
??dest = new BufferedOutputStream(fos, BUFFER);
??while ((count = zis.read(data, 0, BUFFER)) != -1) {
????dest.write(data, 0, count);
??}
??dest.flush();
??dest.close();
}
zis.close();

2.5.2 符合规则的方案

在这个方案中, while循环中的代码会通过使用ZipEntry.getSize()方法在解压之前,得到zip文档中需解压文件的大小。如果该解压文件过大,比如说超过100MB,那么抛出异常。

static final int TOOBIG = 0x6400000; // 100MB

??// ...

??// write the files to the disk, but only if file is not insanely big
??if (entry.getSize() > TOOBIG) {
????throw new IllegalStateException("File to be unzipped is huge.");
??}
??if (entry.getSize() == -1) {
????throw new IllegalStateException(
????????????????"File to be unzipped might be huge.");
??}
??FileOutputStream fos = new FileOutputStream(entry.getName());
??dest = new BufferedOutputStream(fos, BUFFER);
??while ((count = zis.read(data, 0, BUFFER)) != -1) {
????dest.write(data, 0, count);
??}

2.5.3 风险评估

image

2.5.4 相关规范

image

2.5.5 参考书目

image

相关文章
|
1月前
|
SQL 安全 Java
理解Web安全:防止Java Web应用的安全漏洞
【4月更文挑战第3天】在互联网时代,Java Web应用面临严峻的安全挑战,包括注入攻击、XSS、CSRF等。为保护应用,需实施安全措施和最佳实践:如输入验证、输出编码、使用安全框架、防范CSRF、管理会话、加密数据、智能错误处理及定期安全审计。通过这些方法,可降低安全风险,但需持续关注安全趋势并适应新技术。
|
1天前
|
Web App开发 JavaScript 前端开发
《手把手教你》系列技巧篇(四十三)-java+ selenium自动化测试-处理https 安全问题或者非信任站点-上篇(详解教程)
【5月更文挑战第7天】本文介绍了如何在Java+Selenium自动化测试中处理浏览器对不信任证书的处理方法,特别是针对IE、Chrome和Firefox浏览器。在某些情况下,访问HTTPS网站时会遇到证书不可信的警告,但可以通过编程方式跳过这些警告。
12 1
|
8天前
|
消息中间件 安全 Java
Java版云HIS系统:实现多医院患者信息共享与安全管埋
在医疗健康领域,数据的共享与安全已经成为行业发展的重要议题。传统的医院信息系统(HIS)往往受限于单一机构的信息孤岛,无法实现跨院区、跨系统的高效协作和数据互通。然而,随着云计算技术的发展与应用,云HIS系统应运而生,它正引领着一场关于多医院患者信息共享与安全管理的重大变革。
37 6
|
26天前
|
JavaScript Java 测试技术
基于Java的钢铁集团公司安全管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的钢铁集团公司安全管理系统的设计与实现(源码+lw+部署文档+讲解等)
32 6
|
26天前
|
SQL 存储 安全
Java安全编码:防范常见漏洞和攻击
【4月更文挑战第18天】本文介绍了Java安全编码的最佳实践,包括防止SQL注入和XSS攻击,使用预处理语句和转义用户输入。强调了安全的密码存储、角色基础的访问控制以及防止会话劫持和CSRF攻击。此外,还提到数据保护措施,如使用HTTPS和加密敏感数据。最后,建议避免在错误处理中泄露敏感信息并记录审计日志,以提升Java应用的安全性。
|
27天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
18 1
|
29天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
1月前
|
安全 算法 Java
安全无忧:Java并发集合容器的应用与实践
安全无忧:Java并发集合容器的应用与实践
30 0
安全无忧:Java并发集合容器的应用与实践
|
1月前
|
JavaScript Java 测试技术
基于Java的食品安全追溯系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的食品安全追溯系统的设计与实现(源码+lw+部署文档+讲解等)
22 0
|
1月前
|
JavaScript Java 测试技术
基于Java的农产品质量安全检测网站的设计与实现(源码+lw+部署文档+讲解等)
基于Java的农产品质量安全检测网站的设计与实现(源码+lw+部署文档+讲解等)
22 0