三种被坑法 — 密钥、请求来源、以及借出去的凭证
这一章讲三件事: 哪三类事情做错会真的出事;每一类正确的形状长什么样; 以及为什么其中一条是被规范用「禁止」两个字写死的。
它在全书链条里的位置: 前面九章教你把东西连起来、跑起来。 这一章教你不要在跑起来之后把自己搭进去。 它也 是原书最缺的一块——书里承诺过的那一节授权内容,至今没有写出来。
1. 书把安全写成了散落的五句警告,这一章把它们收拢
这一节先说清楚:安全在这本书里长什么样。
它不是一章,是五句话,散在五个不同的位置。 我们把它们收拢在一起:
| 第几句 | 警告的是什么 | 在原书哪儿 | 归本章哪一节 |
|---|---|---|---|
| ① | .env 文件不要提交到代码仓库 | 第一个示例程序旁边1 | §2 |
| ② | 别把本机全部环境变量一股脑传给服务器 | 讲启动参数的地方2 | §3 |
| ③ | 远程线路必须做两件事:认证 + 校验请求来源 | 讲远程线路的地方3 | §4 |
| ④ | 远程 MCP 服务器本身可能是个安全风险 | 讲厂商直连的地方4 | §4、§5 |
| ⑤ | 服务器借用你的模型之前必须有人点头 | 讲采样的地方(第 07 章已讲) | 第 07 章 §3 |
五句合起来正好覆盖三类风险:密钥怎么漏(①②)、连接怎么被冒用(③)、凭证该给谁(④)。
而书里承诺过、却没写出来的那一节,恰恰是最要紧的一节:
讲远程连接参数的地方提到了一个 auth 参数,后面跟着一句
「你将在后面一节学到怎么和支持认证的服务器做会话认证」5——
那一节不存在。
所以从第 4 节起,本章的内容以官方规范为主,书里的警告只作为起点。 每一处我们都会标明来源。
2. 最土的那一种:密钥跟着代码进了仓库
这一节讲第一类风险里最常见、也最容易被低估的一种。
第 04 章讲过:密钥这类东西不写在代码里,写在 .env 文件里。
很多人到这里就觉得安全了。不是。
书里那条警告说的是:不要把 .env 文件提交到版本库(存放代码及其全部修改历史的那个仓库,团队共用),
因为这会把你的接口密钥公开出去,后果包括被人盗用、以及按量计费的账单飙升1。
风险不在文件本身,在提交那一下。 文件躺在你硬盘上没有问题; 一旦它进了版本库,它就永远在那儿了——即使你下一次提交把它删掉, 历史记录里那一版还留着,任何能读这个仓库的人都翻得出来。
所以书里那条警告的后半句才是重点:
如果你不小心提交了,「立刻」登录你的密钥发放方,把泄露的那把或那几把作废掉1。
注意它说的第一件事不是「删文件」,是「作废密钥」。 删文件只是让它以后不再出现;只有作废,才能让已经泄露的那把变成一串没用的字符。
3. 环境变量整包透传给服务器,等于把家底给了它
这一节讲第一类风险里更隐蔽的一种。
回看第 04 章:启动一台本机服务器要交三样东西,第三样是一份环境变量。 问题是:该传哪几个?
最省事的写法是把你这台机器上所有的环境变量一股脑打包传过去—— 一行代码,不用挑,不会漏。书里明写不推荐,理由是它可 能把敏感信息暴露给服务器2。
「敏感信息」具体是什么? 打开你自己的环境变量看一眼,里面通常有:
| 里面可能有什么 | 和这台计算器服务器有关系吗 |
|---|---|
| 你的模型接口密钥 | 没有 |
| 云服务商的凭证 | 没有 |
| 数据库口令 | 没有 |
| 内网地址、代理地址 | 没有 |
CALC_PRECISION(这台服务器真正要的) | 有 |
一股脑传过去,等于把上面整张表交给了一个你从网上下载的第三方程序。 它需要的只有最后一行。
正确做法就一句话:只挑这台服务器明确需要的那几个,一个一个列出来。 麻烦一点,但这份麻烦是一次性的。
4. 远程服务器:先问一句「这条请求是谁发来的」
这一节讲第二类风险,并引入本章后面全部内容都要用到的两个词。
书里那条警告很短,但两件事都点到了:任何远程线路都必须妥善加固, 这包括「对连接做认证」和「校验请求来源」3。
第一件:认证。 服务器得知道来问的是谁。 这件事在网上有一套通行做法,名字叫 OAuth—— 一套「让你不必把口令交给第三方,就能授权它替你办事」的标准流程。
它办完之后交给你的东西叫令牌——一张有期限的通行凭据: 带着它去敲门就代表你被许可了;它不是你的口令,弄丢了也换得掉。 (官方文档里写全称 access token,对照表见总纲。)
MCP 用的正是这一套(具体是它的 2.1 版)6。整条流程大致是:
① 客户端连过去 → 服务器回「401,未授权」,并附上一句「去这儿看我的规矩」
② 客户端按那个地址取到一份说明:该找哪个授权方、能要哪些权限
③ 客户端把用户带到授权方那儿登录、点同意
④ 客户端拿到一张令牌
⑤ 以后每条请求都带上这张令牌
图说:整套流程的目的只有一个——让服务器知道「这是谁」,
而全程你的口令只交给了授权方,没有交给这台 MCP 服务器。
第二件:校验请求来源。 这一件更容易被漏掉,而漏掉的后果很具体。
请求来源校验指的是:服务器检查每一条进来的请求是从哪个网页发出来的, 不是自己人就拒掉。 规范对它的措辞是「必须」7。
漏掉它会怎样? 你在本机跑了一台 MCP 服务器,它监听某个端口。 你浏览器里随便打开的一个陌生网页,是可以往你本机那个端口发请求的—— 如果服务器不看请求是从哪个页面来的,它会老老实实照办。 于是那个网页就借你的手,用上了你本机所有的 MCP 能力。
这也是为什么书里说远程 MCP 服务器「本身可能是个安全风险」4: 你连上的那一台,是别人在运营的。