《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

相关文章
|
21天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
42 4
|
2月前
|
安全 Java 编译器
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型通过参数化类型实现了代码重用和类型安全,提升了代码的可读性和灵活性。本文深入探讨了泛型的基本原理、常见用法及局限性,包括泛型类、方法和接口的使用,以及上界和下界通配符等高级特性。通过理解和运用这些技巧,开发者可以编写更健壮和通用的代码。
|
3月前
|
安全 Java API
java安全特性
java安全特性
29 8
|
3月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
71 11
|
3月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
105 11
|
4月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
4月前
|
Java
【Java集合类面试十二】、HashMap为什么线程不安全?
HashMap在并发环境下执行put操作可能导致循环链表的形成,进而引起死循环,因而它是线程不安全的。
|
4月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
4月前
|
安全 Java 测试技术
深入探讨Java安全编程的最佳实践,帮助开发者保障应用的安全性
在网络安全日益重要的今天,确保Java应用的安全性成为了开发者必须面对的课题。本文介绍Java安全编程的最佳实践,包括利用FindBugs等工具进行代码审查、严格验证用户输入以防攻击、运用输出编码避免XSS等漏洞、实施访问控制确保授权访问、采用加密技术保护敏感数据等。此外,还强调了使用最新Java版本、遵循最小权限原则及定期安全测试的重要性。通过这些实践,开发者能有效提升Java应用的安全防护水平。
51 2
|
4月前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
49 0