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服务, 图片下载器, 暗色界面, 网络访问控制, 自动化攻击, 资源限制