Skip to content

fix(worker): 限制 SSE 存活时间并关闭 workers_dev 防范账单失控 - #150

Open
sunyuan686 wants to merge 2 commits into
realchendahuang:mainfrom
sunyuan686:fix/sse-stream-duration-cap
Open

sunyuan686 wants to merge 2 commits into
realchendahuang:mainfrom
sunyuan686:fix/sse-stream-duration-cap

Conversation

@sunyuan686

Copy link
Copy Markdown

概述

对照 Serverless Horrors 中披露的典型 Serverless 计费陷阱(Denial of Wallet),以**最小改动(3 个文件,8 行代码)**修复当前项目中两个高危的账单失控漏洞。

问题背景与严重性

  1. /api/v1/sse 实时流无限轮询打爆 D1 读配额 (🚨 致命隐患)

    • 问题:当前 SSE 端点没有最大存活时间限制,单个连接每 5 秒硬轮询一次 D1 数据库。
    • 账单危害:单个未关闭的浏览器标签页或后台移动端,一天就会产生 17,280 次 D1 读查询。多设备并发挂着一个月可产生数百万次读取,极易击穿免费额度,带来意外高额账单。
  2. 默认 workers.dev 域名绕过安全与缓存防线 (⚠️ 高危隐患)

    • 问题:配置中未显式禁用 workers_dev,Cloudflare 默认会对外暴露 *.workers.dev 二级域名。
    • 账单危害:外部爬虫可直接请求 workers.dev,完全绕过自定义域名上配置的 WAF 防火墙、Rate Limiting 以及 CDN 缓存策略,直接穿透刷爆 Worker 资源。

解决方案

  • apps/worker/src/routes/memos-sse.ts:
    限制单次 SSE 连接最长存活 60 秒(maxStreamDurationMs = 60_000)。到期后优雅断开,依赖浏览器原生 EventSource 携带 Last-Event-ID 透明自动重连。用户体验完全无感、不漏任何事件,同时彻底杜绝了后台僵尸连接持续空转。
  • wrangler.json & wrangler.jsonc.example:
    显式配置 "workers_dev": false 与 "preview_urls": false,收紧公网入口,强制所有访问经过自定义域名的统一防护与缓存。

验证命令

  • pnpm format:check
  • pnpm --filter @flaremo/worker check
  • pnpm exec vitest run apps/worker/src/transport/sse-stream.test.ts
  • pnpm deploy:dry-run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant