不可信输入与加载器阻断
接收外部上传文件的服务必须限制解码器能执行的操作。libvips 从 8.13 起支持阻断一组未经充分模糊测试(fuzz)的加载器;这是进程级开关,不能替代对单个请求所做的业务层校验。
阻断的是加载器,不是业务校验
Section titled “阻断的是加载器,不是业务校验”VIPS_BLOCK_UNTRUSTED 环境变量以及对应的 vips_block_untrusted_set() 函数会让 libvips 拒绝一组被标记为不可信的操作或加载器。它不会自动检查:
- 像素总量、页数和解码时间是否超过服务预算;
- 文件是否来自允许的存储位置;
- 调用方是否有权读取该对象;
- 输出是否需要剥离 GPS 等敏感元数据。
这些限制必须放在应用自己的接收和探测阶段。环境变量或进程启动时的一次设置,对该进程内后续所有的 libvips 调用生效,不会按请求自动重置。
各入口的支持方式与边界
Section titled “各入口的支持方式与边界”| 入口 | 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 版本文档,避免直接照搬旧版本的操作名称列表。
与生产 Pipeline 的衔接
Section titled “与生产 Pipeline 的衔接”处理不可信上传至少需要同时具备:输入字节数上限、宽高与总像素上限、动图/多页页数上限,以及确保解码失败时不会把半成品当成成功响应写出。流式读取另有独立的取消和错误传播规则,见Reader/Writer 流式 I/O。完整的六阶段划分见构建第一个完整图像 Pipeline。