我用微软 Edge 的「大声朗读」接口搭了个转发器,跑在 Cloudflare Workers 上。请求进来,音频出去,代码没几行。唯一的问题是,它烧的是我的微软账号额度。这么个接口不设防挂在网上,等于把水龙头拧开摆在路边。
我加了两道门,没再加第三道。下面说清楚它挡住什么、挡不住什么,以及我为什么停在这里。
第一道门:Origin 白名单
服务读一个环境变量 ALLOWED_ORIGINS,逗号分隔。请求的 Origin 不在名单里,直接 403。
Origin 是浏览器自动带上的头,普通用户改不了。这道门真正拦的是「别人把自己的网页指过来」:有人用 iframe 或 fetch 白嫖,浏览器会老实报上他的域名,不在名单里就挡下。
它拦不住 curl。命令行里手写一个 Origin,照抄我名单里的域名,照样能过。所以这道门防的是顺手牵羊,不是撬锁。
第二道门:TOKEN
环境变量里配一个 TOKEN,请求带对得上的 token 参数才放行,否则 401。不配就完全开放。
这道比第一道重,因为不好猜。但有个前提得先认:token 放在 URL 里,在浏览器里是明文的,翻一下网络请求就能看到,谈不上保密。
叠在一起
单看,两道都有漏洞。叠在一起,事情就变成:想白嫖的人得同时伪造一个 Origin,再抄一个 token。能做到这一步的人,本来也不是这两道门拦得住的,他直接拆我的前端就行。
所以我的目标不是杜绝盗用,是抬高盗用的成本。让人多花五分钟,觉得不值当,就够了。
为什么不再加一道
严格的办法多的是:token 挪进 header、加签名、上 WAF、按 IP 限流、加验证码。每加一层,就多一份要我维护的东西。对个人服务,这笔账不划算。
我认这条线:防君子不防小人。
真要再加,只加一样
哪天真被刷了,我只会上平台自带的限流。Cloudflare 有 Rate Limiting Rules,Vercel 有 Firewall,后台点几下就开,挡住某个 IP 的疯狂重试,不写代码,也不给正常使用添堵。
思路跟前两道门一样:够用就行。