这与问题about zip bombs有关,但要考虑 gzip 或 bzip2 压缩,例如接受 .tar.gz
文件的 Web 服务。
Python 提供了一个方便的 tarfile module使用起来很方便,但似乎不能提供针对 zipper 炸弹的保护。
在使用 tarfile 模块的 python 代码中,检测 zip 炸弹最优雅的方法是什么,最好不要从 tarfile 模块复制太多逻辑(例如透明解压缩支持)?
而且,只是为了让它不那么简单:不涉及真正的文件;输入是一个类似文件的对象(由网络框架提供,代表用户上传的文件)。
最佳答案
您可以使用 resource
module限制您的进程及其子进程可用的资源。
如果您需要在内存中解压缩,那么您可以设置 resource.RLIMIT_AS
(或 RLIMIT_DATA
、RLIMIT_STACK
),例如,使用上下文管理器自动恢复到以前的值:
import contextlib
import resource
@contextlib.contextmanager
def limit(limit, type=resource.RLIMIT_AS):
soft_limit, hard_limit = resource.getrlimit(type)
resource.setrlimit(type, (limit, hard_limit)) # set soft limit
try:
yield
finally:
resource.setrlimit(type, (soft_limit, hard_limit)) # restore
with limit(1 << 30): # 1GB
# do the thing that might try to consume all memory
如果达到限制; MemoryError
引发。
关于python - 如何保护自己免受 gzip 或 bzip2 炸弹的伤害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622706/