hskl18/Website-Image-Downloader
GitHub: hskl18/Website-Image-Downloader
一个内置 SSRF 防护和资源限制的 Next.js 网页图片批量下载服务,能从公开页面提取图片并以 ZIP 形式返回。
Stars: 0 | Forks: 0
# 网站图片下载器
Website Image Downloader 是一个受边界限制的 Next.js 服务,它可以从网页中提取公开的图片 URL,并将下载的文件以 ZIP 压缩包的形式返回。
该实现侧重于安全的出站请求、可预测的资源使用以及可复现的验证。
## 安全边界
- 仅允许标准端口上的公共 HTTP 和 HTTPS 目标地址。
- DNS 结果会经过验证并固定在出站连接上,以降低 DNS 重绑定(DNS rebinding)的风险。
- 每次重定向都会被解析、验证并重新固定。
- 拒绝环回、私有、链路本地以及云元数据目标地址。
- 页面响应大小限制为 2 MiB。
- 每张图片的大小限制为 8 MiB,单个压缩包限制为 32 MiB。
- 单个请求最多处理 40 张图片,并且支持四个并发的图片下载。
- 单个进程同一时间最多处理两个压缩任务,当达到满负荷时将返回 `429` 状态码以及 `Retry-After`。
- 出站请求在 10 秒后超时。
这些进程级别的限制属于纵深防御措施。
多实例部署还应配合使用平台级别的速率限制和滥用监控。
## 支持的提取范围
- HTML `
` 属性。
- 内联样式中发现的 CSS `background-image` URL。
- 根据最终的公共页面 URL 解析出的相对图片 URL。
- ZIP 文件名在下载前会进行标准化和去重处理。
## 本地开发
使用 Node.js 22 或更高版本。
```
npm ci
npm run dev
```
打开 。
post-install 脚本会安装 Puppeteer 所使用的 Chrome 构建版本。
仅在不需要执行基于浏览器抓取的环境中设置 `PUPPETEER_SKIP_DOWNLOAD=true`。
## 验证
```
npm audit
npm test
npm run lint
npm run typecheck
npm run build
```
测试套件涵盖了被阻止的网络范围、重定向验证、DNS 重绑定、响应限制、请求体取消、并发限制以及 API 错误响应。
## API
`POST /api/download-images` 接受包含公共 `url` 的 JSON 数据,并在配置的限制内成功下载至少一张受支持的图片时,返回一个 ZIP 压缩包。
## 许可证
本项目基于 [MIT License](LICENSE) 开源。
标签:MITM代理, Puppeteer, SSRF防护, Web服务, 图片下载器, 暗色界面, 网络访问控制, 自动化攻击, 资源限制