2 个版本

0.1.1 2019年6月28日
0.1.0 2018年10月31日

#224 in 多媒体

MIT/Apache

150KB
1.5K SLoC

Rust 710 SLoC // 0.0% comments JavaScript 404 SLoC TypeScript 393 SLoC // 0.0% comments

quad-image

Build status

一个非常简单的图像托管API,以及支持文件。

  • 您发送一张图片。
  • 使用 Piston Image 对图片进行解码和重新编码。
  • 图片被保存到本地磁盘。
  • 返回图片的URL。

构建

quad-image可能仅在libc/Unix操作系统上工作。它需要Rust,稳定版应该没问题。

通过运行 cargo build --release 来构建,并从 target/release/quad-image 中获取二进制文件。

托管

预期的部署情况是

  • quad-image在服务管理器下运行。
  • 由Web服务器提供服务的 web/ 子目录
  • Web服务器代理流量到 quad-image

quad-image.nginx (用于nginx) 和 quad-image.service (用于systemd) 中有示例配置文件。所有端口/地址都是硬编码的。

安全性

HTTP由Rouille处理,这是一个简单的Rust HTTP库。预计您将在 nginx 后运行API服务器,因此它甚至不需要处理TLS或任何HTTP怪异之处。

用户无法控制目标文件名。他们无法合理地覆盖服务器上的文件,或生成他们选择的URL。

在写入文件系统之前,使用Piston Image对图片进行解码和重新编码,应该没有方式可以提供非图像数据。也就是说,所有到达文件系统的文件都是有效的,最小图像,其中不包含任何额外信息,无论是在元数据中还是在文件的其他地方。

这可以防止

  • 用户上传包含元数据中GPS位置的图片
  • 提供其他图像库的漏洞利用
  • 分发不属于图像的负载
  • 配置不当的Web服务器尝试将上传的文件作为PHP执行

活塞图像库是一个Rust库,可能没有像libpnglibjpeg等库所有的内存损坏错误,几乎肯定没有imagemagick的convert具有的所有疯狂的故障模式。

依赖项

~64MB
~1M SLoC