IDE 插件把光标附近的代码发给模型,看起来只是一段补全请求。问题是,“附近”可能同时包含连接串、测试凭证和还没有公开的业务规则。网关把password替换成星号,不等于这段代码已经获得外发许可。
2026 年 10 月 9 日,Anthropic 发布了对评估与内部使用中非预期模型行为的调查。对后端团队来说,值得带回设计评审的问题是:工具边界必须由系统落实,不能只靠模型理解任务意图。原始调查讨论的是具体观察,不能据此推算我们自己的泄露概率。
先决定能不能发,再讨论怎么遮罩
我会把代码辅助请求拆成三项独立判断:仓库和路径是否允许交给该提供商;请求是否只带完成当前任务所需的上下文;允许外发的片段是否仍含可识别的敏感值。第一项属于权限策略,第二项属于检索和上下文组装,第三项才是脱敏探针。
例如支付仓库里的内部定价算法,即使没有任何密钥,也可能不适合发到外部模型。反过来,一段开源示例出现token=demo,也不能只凭变量名就断言发生了真实泄露。探针的结果需要附带命中规则和处理方式,供人复核,不能只返回一个“安全”布尔值。
图里的拒绝分支没有回到模型请求:业务可以重新提交经过批准的输入,但系统不能因为第一次被拒绝,就换一个通道继续发送同一份内容。
一个可以运行的小探针
下面只处理教学约定的token=值、password=值形式;它不是通用凭证检测器。保留尾部上下文时按 Unicode 码点截取,避免把 Java 的 UTF-16 代理项切成半个字符。实际 tokenizer 的 Token 预算还要单独计算。
保存为Demo.java,用javac --release 11 Demo.java编译,再运行java Demo。
import java.util.regex.Pattern; public class Demo { static final Pattern SECRET = Pattern.compile( "(token|password)=[^;\\s]+", Pattern.CASE_INSENSITIVE); static String mask(String code) { return SECRET.matcher(code).replaceAll("$1=<masked>"); } static String tail(String value, int maxCodePoints) { if (maxCodePoints < 0) throw new IllegalArgumentException("negative limit"); int count = value.codePointCount(0, value.length()); int start = value.offsetByCodePoints(0, Math.max(0, count - maxCodePoints)); return value.substring(start); } static void check(boolean ok) { if (!ok) throw new AssertionError(); } public static void main(String[] args) { check(mask("token=example; x=1").equals("token=<masked>; x=1")); check(tail("甲😀乙", 2).equals("😀乙")); check(tail("甲😀乙", 0).isEmpty()); check(mask("business_rule=private").contains("private")); System.out.println("mask and Unicode boundaries OK; business secrets remain undetected"); } }最后一项检查故意验证漏检边界:普通规则字符串不会被这个探针识别。测试通过只说明约定格式被处理、字符边界没有切坏,不说明代码可以外发,也不说明任何真实凭证已经被找全。
真正需要补上的工程约束
规则要在本地执行,原始片段不能先进入远端审查日志。日志记录规则编号、路径策略版本和请求标识即可,命中原文应按敏感数据管理。多行字符串、拼接、编码和配置注入都可能绕过简单正则;对高风险仓库,拒绝外发通常比不断叠加正则更清楚。
OWASP 的敏感信息披露条目也把数据清理和访问控制视为应用层责任,并提醒提示词约束可能被绕过。这里没有调用真实模型或企业 DLP 服务,误报率、漏报率和请求时延都没有实测。上线前需要用获得授权的样本集验证这些指标,而不是从几条单元样例推导“毫秒级绝对安全”。
代码辅助入口值得做脱敏,但更早的一步,是让每次外发都能回答:谁允许、允许哪些内容、失败后停在哪里。
本地运行环境为 Java/javac 12.0.1,使用--release 11编译并执行了文中的检查;没有安装新依赖。该结果只覆盖示例列出的逻辑,不代表真实模型、浏览器或生产链路已经验证。