防止中转站拿到请求中的 API 密钥,并拦截危险的工具调用#
中转站能看到请求的全部内容,包括混进对话中的密钥,例如粘贴进来的 .env 文件、工具读取的配置文件。ThinkWatch Lite 的出站脱敏在请求离开本机之前查找这些凭据,在「替换」档下改为发送 <<TW_SECRET_1>> 这样的占位符,回答中出现占位符时再还原为原值。工具调用审查检查上游返回的工具调用,在「切断」档下,下载即执行、外发凭据之类的调用在客户端执行之前即被拦下。
准备#
- 已安装 ThinkWatch Lite,并已接管客户端,请求经过网关。本文按 2026.10.17 版编写。
- 两项防护出厂均为「观察」:只记录检出的内容,不做任何改动。「关闭」档不检查也不记录。
步骤#
- 打开安全页。「日志」标签列出各项防护检出的内容及其所属的请求;两档使用同一套规则,因此先在「观察」档下运行几天,即可看出切换到「替换」后会改动哪些内容。
- 打开「出站脱敏」标签。内置规则可以逐条启用或停用,「测试…」对粘贴的文本显示「发出的内容」。
- 内置规则未覆盖的密钥格式,选择「新建规则」,填写「名称」。「匹配方式」中,「包含」按原样查找文字,
.、*等字符没有特殊含义;「正则」按正则表达式匹配。「区分大小写」默认关闭。填写要查找的文字或正则表达式,以及「占位符名称」(例如INTERNAL,替换为<<TW_INTERNAL_1>>),然后选择「创建」。 - 把标签顶部的档位切换到「替换」。
- 打开「工具调用审查」标签。每条内置规则的处置为「切断」或「仅记录」,可以在「查看规则」中修改。把档位切换到「切断」。
- 此后日志的「处置」一栏显示「已替换」或「已切断」;调用被切断时还会发送系统通知。自 ThinkWatch Lite 2026.10.12 起,记录可以在原处展开,显示命中的位置与替换成的占位符,或被切断的工具调用及客户端收到的提示。
说明#
| 档位 | 出站脱敏 | 工具调用审查 |
|---|---|---|
| 「观察」(出厂) | 检出的内容记入日志,请求原样发出。 | 命中的调用记入日志,照常返回。 |
| 「替换」/「切断」 | 检出的内容替换为占位符后发出,响应中的占位符还原为原值。 | 命中「切断」规则的调用不会完整到达客户端;「仅记录」规则仍只记录。 |
- **出站脱敏的范围。**查找整个请求,包括系统提示、之前的对话和工具调用,但不查找字段名和图片等 base64 数据。自定义规则还会跳过协议要求原样保留的标识:条目与调用的 id、类型、角色、工具名和模型名;内置规则照常查找这些值。内置规则覆盖 Anthropic、OpenAI、GitHub、Slack、AWS(访问密钥 ID)、Google、GitLab、Stripe、npm、DigitalOcean、SendGrid 的 API 密钥与令牌,私钥、JWT、连接串中的口令,以及号码结构与校验位都正确的身份证号和银行卡号。邮箱地址、中国大陆手机号、内网地址、内部域名四条规则出厂为停用。
- **2026.10.17 之前保存的规则。**此前版本保存的自定义规则按区分大小写的正则表达式匹配,现在改为按原样查找文字、不区分大小写。依赖正则表达式的规则仍可加载,但不再命中,也没有任何提示;应逐条打开,选择「正则」,需要区分大小写的再打开「区分大小写」。
- **原值如何还原。**同一个值在整个请求中只对应一个占位符,无论发往哪个上游都不变。模型在文字或工具调用参数中写回的占位符,在交给客户端之前还原:用到这把密钥的命令在本机以原值执行,中转站始终只看到占位符。
- **哪些调用会被切断。**下载或解码后执行代码、外发环境变量或凭据文件、读取私钥或云凭据、把凭据发往陌生主机、写入启动项或安装定时任务的调用。删除主目录或根目录、开放全部写权限、上传本地文件三类内置规则出厂只记录。
- **中转站仍能看到的内容。**应用中为该上游配置的密钥,以及请求的其余内容,例如代码、文件内容和对话,均按原样发给中转站。客户端连接网关所用的密钥不会转发;客户端的身份信息也不转发,除非在该上游上打开「转发客户端身份」。
- **只按规则匹配。**只有命中规则的值才会被替换;没有固定前缀的凭据(例如 AWS 私有访问密钥)需要自定义规则。写法不在任何规则之内的危险命令,工具调用审查拦不住。
- **看不到网关之外。**中转站在自己的服务器上做了什么,例如留存请求、换用其他模型作答,各项防护无从得知。上游页在上游名称旁标出的「模型名不符」等偏差可以显示后者的迹象,但不能证明。
- **动手的代价。**请求内容改变后,上游的提示缓存可能无法命中;「切断」档下误判时,回答会在该调用处中断。