跳转到内容

不可信输入与加载器阻断

复制本页

接收外部上传文件的服务必须限制解码器能执行的操作。libvips 从 8.13 起支持阻断一组未经充分模糊测试(fuzz)的加载器;这是进程级开关,不能替代对单个请求所做的业务层校验。

阻断的是加载器,不是业务校验

Section titled “阻断的是加载器,不是业务校验”

VIPS_BLOCK_UNTRUSTED 环境变量以及对应的 vips_block_untrusted_set() 函数会让 libvips 拒绝一组被标记为不可信的操作或加载器。它不会自动检查:

  • 像素总量、页数和解码时间是否超过服务预算;
  • 文件是否来自允许的存储位置;
  • 调用方是否有权读取该对象;
  • 输出是否需要剥离 GPS 等敏感元数据。

这些限制必须放在应用自己的接收和探测阶段。环境变量或进程启动时的一次设置,对该进程内后续所有的 libvips 调用生效,不会按请求自动重置。

入口 libvips 8.17 / 8.18 支持方式与边界
vips CLI 进程环境里的 VIPS_BLOCK_UNTRUSTED 作用于该命令链接的 libvips
pyvips 2.2.1 起提供 block_untrusted_set() 与 operation_block_set(),底层直接调用 libvips 的同一组控制接口
govips v2.19.0 公开 API 没有单独封装 untrusted 函数;进程链接系统 libvips 时可通过环境变量 VIPS_BLOCK_UNTRUSTED 控制
sharp 0.35.5 预构建包自带 libvips 8.18.7;是否继承进程环境变量需在实际部署镜像中结合启动顺序验证

操作级阻断(如 operation_block_set)可以进一步按名称禁用特定操作。配置黑名单前应对照当前运行的 libvips 版本文档,避免直接照搬旧版本的操作名称列表。

处理不可信上传至少需要同时具备:输入字节数上限、宽高与总像素上限、动图/多页页数上限,以及确保解码失败时不会把半成品当成成功响应写出。流式读取另有独立的取消和错误传播规则,见Reader/Writer 流式 I/O。完整的六阶段划分见构建第一个完整图像 Pipeline。

安装方式和动态库链接决定了这些开关是否真正作用于当前进程,请先核对安装与环境检查和版本兼容矩阵。