python - 如何保护自己免受 gzip 或 bzip2 炸弹的伤害?

标签 python security gzip bzip2

这与问题about zip bombs有关,但要考虑 gzip 或 bzip2 压缩,例如接受 .tar.gz 文件的 Web 服务。

Python 提供了一个方便的 tarfile module使用起来很方便,但似乎不能提供针对 zipper 炸弹的保护。

在使用 tarfile 模块的 python 代码中,检测 zip 炸弹最优雅的方法是什么,最好不要从 tarfile 模块复制太多逻辑(例如透明解压缩支持)?

而且,只是为了让它不那么简单:不涉及真正的文件;输入是一个类似文件的对象(由网络框架提供,代表用户上传的文件)。

最佳答案

您可以使用 resource module限制您的进程及其子进程可用的资源。

如果您需要在内存中解压缩,那么您可以设置 resource.RLIMIT_AS(或 RLIMIT_DATARLIMIT_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/

相关文章:

gzip - Tomcat 8.5.29 HTTP/2 不支持 GZIP 压缩

python - 计算 AP 的距离,包括信噪比

python - 在django模板中显示parent_model

c# - 使用 Gzip 压缩/解压缩字节数组

javascript - 如何防止 'type-jacking'?

security - 通过 HTTP 强制使用 HTTPS

python - python urllib2 会自动解压缩从网页获取的 gzip 数据吗?

python - Owlready2 优化不可用

python - 在两个 Numpy 数组之间创建 Pandas Dataframe,然后绘制散点图

php - 使用 str_replace 是否足以防止 SQL 注入(inject)攻击?