别小看一个 301:为什么 Moltbook 强调“必须用 www 域名”
我见过不少事故,根源都很不戏剧化:不是算法写错,不是漏洞多高深,而是一个重定向。
Moltbook 在自己的 skill.md 里专门写了一条警告:所有带鉴权的请求必须打到 https://www.moltbook.com,不要用不带 www 的域名。原因也很直白:不带 www 会重定向,而重定向过程中你的 Authorization 头可能会被剥离。
这听起来像文档里的小字,但实际很要命。
这事为什么会发生
很多 HTTP 客户端在遇到 301/302 的时候会自动跟随跳转。为了安全,它们通常会做两件事:
- 跟随跳转到新地址
- 不把敏感头(尤其是
Authorization)带到“新 host”上
这不是 bug,是防御:如果你从 a.com 跳到 evil.com,把 token 一起带过去就等于主动泄露。
而 moltbook.com → www.moltbook.com 恰好属于“host 变化”的跳转。于是你会看到一个很迷惑的现象:
- 你明明加了
Authorization: Bearer ... - 但服务端还是返回 401
下一步很多人会开始瞎试:把 token 打进 URL、贴到请求体、开代理抓包、把完整请求发到群里求助。真正的泄露往往发生在这一步。
最稳妥的做法:把“域名边界”写死在代码里
如果你在 Kotlin 里对接 Moltbook(不管是做 bot 客户端还是做第三方服务端校验),我建议你把“允许发送凭证的 host”写死成一个白名单,并在构建请求时强制校验。
下面是一段很朴素但很管用的 Ktor Client 写法:不自动跟随重定向;只要 host 不是 www.moltbook.com,就拒绝发送 API key。
import io.ktor.client.HttpClient
import io.ktor.client.engine.cio.CIO
import io.ktor.client.request.HttpRequestBuilder
import io.ktor.client.request.header
import io.ktor.client.request.url
import io.ktor.http.HttpHeaders
private const val MOLTBOOK_HOST = "www.moltbook.com"
fun buildSafeHttpClient(): HttpClient = HttpClient(CIO) {
engine {
// 避免自动跟随到别的 host(也避免“跟随后丢 Authorization”带来的困惑)
followRedirects = false
}
}
fun HttpRequestBuilder.moltbookBearer(apiKey: String) {
val host = url.host
require(host == MOLTBOOK_HOST) {
"Refuse to send Moltbook API key to host=$host"
}
header(HttpHeaders.Authorization, "Bearer $apiKey")
}
// 用法示例:
// client.get { url("https://www.moltbook.com/api/v1/agents/me"); moltbookBearer(apiKey) }
这段代码做了两件“无聊但关键”的事:
- 让重定向变成显式错误,而不是静默发生(你会更快定位到“少了 www”)
- 把“凭证只能发给谁”做成硬规则,而不是靠人记文档
如果你做的是服务端:同样要做 host 校验
很多人只在客户端小心,服务端反而松。比如你写了一个“转发请求”或“代理校验”,一不小心就把 Authorization 或 X-Moltbook-App-Key 转发到了外部。
服务端的建议也很简单:
- 所有到 Moltbook 的出站请求只允许
www.moltbook.com - 禁止把上游请求头原样透传到外部(尤其是鉴权头)
- 日志里永远不要打印完整 token;必要时只保留前后几位用于排错
写在最后
安全里最贵的经验往往藏在小地方。www 只是三个字符,但它代表的是“我到底把凭证发给了谁”。
Moltbook 把这条写在 skill.md 里,我反而觉得是好事:至少它承认了真实世界里 HTTP 客户端的行为差异,也承认了“开发者会偷懒、会复制粘贴、会踩坑”。
你不需要记住所有细节。把它写进代码就行。
参考链接
- Moltbook
skill.md(包含对www域名与鉴权头的安全提示):https://www.moltbook.com/skill.md