在不控制资源消耗的情况下提取存档文件对安全性敏感,并且可能导致拒绝服务。
我们的代码在服务器上执行,但是您应该知道服务器具有限制。基于此,请检查代码可以消耗多少硬件资源。资源是CPU,RAM,磁盘,网络...了解这些限制,并根据这些限制,将阈值放入您的代码中。
这是提取邮政编码时应该在代码中放入的一些重要阈值。
1.限制提取的存档的大小
这是提取拉链档案时应该介绍的最基本和关键的阈值。
如何限制提取的尺寸?
提取存档后可以检查大小,但这可能为时已晚。如果提取的内容太大,它可能会耗尽您的服务器资源。
您应该在提取过程中包括大小阈值检查。每次提取并从存档中获取一些字节时,都会比较总尺寸与阈值。
拉链档案也有元数据。在元数据中,您可以找到每个条目的文件大小。但是,正如另一个应用程序所写的元数据一样,此信息不需要正确。
2.限制存档中的条目数量
每个文件系统在可以在目录/分区/硬盘驱动器中处理的文件和目录的数量有一些限制...这些限制通常是巨大的数字。即便如此,这还是一个有限的资源。在Sonar article中有以下语句:
Too many entries in an archive, can lead to inodes exhaustion of the system.
inodes是指向磁盘上文件的实际位置的索引。如果您的文件系统上有太多的小文件,它可能会排出可用的inodes。因此,您的系统无法存储新文件。
inodes在Linux/Unix文件系统上使用,但Windows也存在类似的限制。资料来源:stackoverflow。
3.保护自己免受拉链炸弹
Successful Zip Bomb attacks occur when an application expands untrusted archive files without controlling the size of the expanded data, which can lead to denial of service.
来源:Sonar article
拉链炸弹通常是一个恶意档案文件,其中几千字节的档案是用千兆字节测量的提取内容。为了达到这种极端的压缩比,攻击者将压缩无关紧要的数据(例如,一连串的重复字节)。
您可以拥有总存档大小阈值,但是您应该始终努力快速失败。压缩比可以使您了解存档中的数据是否相关。大多数合法档案的数据压缩率为1至3。在Sonar文章阈值中的示例中,这应该是一个很好的价值。
Here您可以找到示例zip炸弹文件。
4.禁止存档中的文件夹。
与您的商人联系,您是否可以禁止存档中的文件夹。作为回报,您将避免在代码中递归。
为什么这很重要?
- 如果您不正确地实现递归,则可以以许多方式破坏您的应用程序。
- 它还将为您的代码增加额外的复杂性,这可能导致错误。
- 将需要更多的工作才能了解代码的逻辑。
- 很难维护该代码。
在服务器环境中,使用递归是危险的!如果您需要实施递归,请格外小心!
5.不要在档案中提取档案
这也将创建与提取文件夹内容相同的问题。最好选择以下选项之一:
- 将存档中的存档文件视为所有其他文件 - 不要提取它们。
- 与业务联系,如果您可以禁止存档中的存档文件。您可以问这个问题,因为压缩已经压缩的存档不会导致较小的文件。 \ \ 您可以通过在提取过程中检查输入扩展和MIME类型来禁止存档条目。
6.不要仅依靠存档条目元数据
档案包含在提取过程中可以阅读的元数据。压缩应用程序在压缩过程中在存档中写下了这些数据。
问题是,如果您仅依靠这些属性,则需要信任不在您控制中的压缩应用程序。黑客可以创建假元数据并压碎您的应用程序。
使用ZIP存档元数据时要小心。始终问自己攻击者如何滥用它来破解您的提取算法。