我的代码到底传到了哪里
利益声明:本文作者参与了 wescode 的开发。文中涉及 wescode 的技术描述基于内部测试数据;涉及其他工具的描述基于各家公开文档和社区反馈。
你用 AI 编程工具改了一段业务逻辑。AI 帮你改好了。
那段代码——包含你公司的数据库表结构、API 密钥前缀、内部接口命名规范——在这个过程中去了哪里?
大多数人没想过这个问题。因为 AI 编程工具的界面看起来就像本地操作——你在编辑器里对话、在编辑器里看改动——好像什么都没出去。
但其实有。
一个容易被忽略的事实
AI 需要看到你的代码才能帮你改代码。 这不是 bug,是基本原理。
LLM 的工作方式是:你把代码放进 prompt → 模型处理 → 返回建议。这意味着代码必须以某种形式到达运行模型的服务器上。
问题不在于"代码有没有出去"——只要你用云端 AI 模型,代码一定出去了(某种形式上)。
问题在于:出去的路径上经过了谁、停留了多久、以什么形式保存。
数据流路径对比:中间经过了几个节点

你以为所有 AI 编程工具的数据流都是一样的:编辑器 → 模型供应商。
实际上,大部分工具在中间多了一个节点——工具方的后端服务器。这个节点做代码索引、prompt 组装、Embedding 计算、日志记录。区别在于这个节点存在不存在。
Cursor 的数据流
你的代码
│
▼
[Cursor 客户端]
│
│── (网络) ──▶ [Cursor 后端服务器]
│ ├─ 代码索引:代码片段上传,计算 Embedding 向量
│ ├─ Prompt 组装:把上下文拼成 prompt
│ ├─ 存储:Embedding 向量 + 混淆文件名长期存数据库
│ └─ 转发请求
│ │
│ ▼
│ [OpenAI / Anthropic]
│
▼
返回结果
Cursor 官方确认:即使你用自己的 API Key,请求仍然经过 Cursor 的后端做 prompt 组装("Even if you use your API key, your requests will still go through our backend." — Cursor Privacy FAQ)。代码索引时,代码片段上传到 Cursor 服务器计算 Embedding——明文不持久存储,但 Embedding 向量和混淆后的文件名长期存在他们的数据库里。
wescode 的数据流(BYOK 直连模式)
你的代码
│
▼
[wescode 本地进程]
├─ 代码解析:tree-sitter 本地 AST 解析
├─ 索引存储:SQLite 本地文件(~/.wescode/cells/)
├─ Prompt 组装:本地拼接上下文 + 用户指令
│
│── (网络) ──▶ [OpenAI / Anthropic / DeepSeek](直连,无中间节点)
│
▼
返回结果
wescode + 本地模型(零出站模式)
你的代码
│
▼
[wescode 本地进程]
├─ 代码解析:本地
├─ 索引存储:本地
├─ Prompt 组装:本地
│
│── (本机回环) ──▶ [Ollama / vLLM](本地运行,零网络出站)
│
▼
返回结果(全程未离开你的电脑)
区别一目了然:Cursor 的路径上有一个你不控制的中间节点;wescode 的路径上没有。
各工具安全特性完整对比

不同工具的数据处理方式差异很大。下面是一个尽可能客观的对比:
| 维度 | Cursor | Claude Code | GitHub Copilot | 通义灵码 | Trae | wescode |
|---|---|---|---|---|---|---|
| 代码是否经过第三方服务器 | ✅ 经过 Cursor 后端 | ✅ 经 Anthropic API | ✅ 经 GitHub/Microsoft 后端 | ✅ 经阿里云后端 | ✅ 经字节后端 | 否,BYOK 直连供应商 |
| 索引数据存储位置 | Cursor 数据库(Embedding + 混淆文件名) | 无持久索引 | GitHub 数据库 | 阿里云 | 字节服务端 | 本地 SQLite |
| Privacy Mode | ✅ 有(不训练、不持久存明文) | ✅ 默认不训练 | ✅ Business 版可关闭遥测 | ⚠️ 有声明但细节较少 | ⚠️ 有声明但细节较少 | N/A(不经第三方) |
| 数据驻留区域 | 美国 | 美国 | 美国 | 中国 | 中国 | 你指定的 API 地址 |
| BYOK 时是否仍经后端 | ⚠️ 是 | N/A | ⚠️ 是 | N/A | N/A | 否,不经过 |
| 本地模型支持 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持(Ollama/vLLM) |
| 可达到零出站 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | 支持 |
几个要注意的点:
- 通义灵码和 Trae 的优势是数据在国内。对于很多公司来说,"数据不出境"比"数据不经第三方"更容易过合规——因为数据出境本身就是一个需要审批的合规事项。
- Claude Code 相对简单。它不做持久索引,不存 Embedding,本质上是一个终端里的 Claude API 客户端。但代码仍然经过 Anthropic 的 API。
- Copilot Business 版可以关闭代码片段收集和遥测,这对企业用户是一个有意义的选择。
wescode 的安全架构:五层模型
wescode 的"代码不出设备"不是一句口号,而是五层架构设计的结果——每一层都在做一件具体的事:

| 层 | 技术机制 | 保护什么 | 对应的 Cursor 处理方式 |
|---|---|---|---|
| 1. 代码解析 | tree-sitter 本地 AST 解析 | 源码不上传做语法分析 | 远端索引需上传代码片段 |
| 2. 索引存储 | SQLite 本地文件(CKG 图谱 + FTS5 全文索引) | 索引数据不上传 | Embedding 向量存在 Cursor 数据库 |
| 3. Prompt 组装 | 本地拼接:CKG 上下文 + 文件内容 + 用户指令 | 上下文组装不经中间方 | prompt 在 Cursor 后端组装 |
| 4. LLM 调用 | BYOK 直连模型供应商 API | 请求不经 wescode 服务器 | 即使 BYOK,请求仍经 Cursor 后端 |
| 5. 本地模型 | Ollama / vLLM 本地推理 | 全程零网络出站 | 不支持接本地模型 |
每一层展开来看:
第 1 层:本地代码解析。 wescode 使用 tree-sitter 在本地做 AST(抽象语法树)解析。这意味着代码的语法分析——函数边界、调用关系、类型信息——完全在你的电脑上完成。Cursor 的代码索引需要把代码片段上传到后端计算 Embedding——这是功能差异导致的架构差异。
第 2 层:本地索引存储。 CKG(代码知识图谱)的 10-Pass 索引结果、FTS5 全文搜索索引,全部存在本地 SQLite 文件里(位于 ~/.wescode/cells/ws-{hash}/ 目录下)。这些索引包含了你的函数签名、调用关系、文件结构——如果上传到云端,本质上等于上传了你项目的架构蓝图。
第 3 层:本地 Prompt 组装。 当你对 AI 提问时,wescode 在本地把 CKG 检索到的上下文、当前文件内容、你的指令拼接成 prompt。这个过程不经过任何远端服务器。Cursor 的 prompt 组装发生在它的后端——这就是为什么即使 BYOK,请求仍然经过 Cursor 服务器。
第 4 层:BYOK 直连。 拼好的 prompt 直接发送到你指定的模型供应商 API(OpenAI / Anthropic / DeepSeek),不经过 wescode 的任何服务器。你可以用 tcpdump 验证——出站请求的目标 IP 只有模型供应商的地址。
第 5 层:本地模型。 接 Ollama 或 vLLM,整个流程零网络出站。这是安全要求最极端的场景——代码从始至终没有离开你的电脑。
前四层保证"你的代码只在两个地方出现过:你的电脑和模型供应商"。第五层保证"你的代码只在一个地方出现过:你的电脑"。
"开了 Privacy Mode 就安全了"?精确看看它保护什么
Cursor 和 Copilot 都提供 Privacy Mode。开了之后确实更安全——但它保护的范围和很多人以为的不一样:
Privacy Mode 保护的 vs 不保护的
| Privacy Mode 保护的 | Privacy Mode 不保护的 |
|---|---|
| 代码不用于模型训练 | 代码仍经过 Cursor 后端——请求路径没变 |
| 明文代码不被持久存储(请求处理期间除外) | Embedding 向量仍存在数据库——索引数据长期保留 |
| 代码不被分享给其他用户 | 混淆后的文件名仍存在数据库——目录结构指纹保留 |
| 代码不出现在 Cursor 的训练数据集里 | 风控触发时数据可能被留存调查——这是合理的安全实践,但意味着"不持久存储"有例外 |
Privacy Mode 解决的是"我的代码会不会被拿去训练别人的模型"——对大多数个人开发者来说,这已经够了。
但它没有解决"我的代码是否经过了第三方服务器"——对有安审要求的公司来说,代码途经第三方本身就是一个合规问题,不管这个第三方承诺了什么。
Embedding 向量到底能暴露什么
"Embedding 向量又不是代码原文,有什么好担心的?"
从技术上说,Embedding 向量不能直接还原代码文本——这是对的。但它携带的信息比很多人以为的多:
- 语义信息:向量编码了代码"在做什么"。通过向量相似度可以推断你的代码涉及支付处理、用户认证、数据加密等功能领域
- 架构模式指纹:向量之间的聚类关系暴露了项目的模块边界和依赖结构——哪些文件紧密相关、项目的分层方式
- 混淆文件名:虽然不是原始路径,但保留了目录层级结构。
a/b/c.ts和a/b/d.ts的关系仍然可见 - 时序信息:索引更新的时间线暴露了开发活动——哪些模块最近在被频繁修改
学术界已经有多项研究表明,文本 Embedding 可以在一定条件下被反向工程。2023 年的一项研究(Text Embeddings Reveal (Almost) As Much As Text, Morris et al.)证明了在特定条件下,可以从 Embedding 向量恢复出原始文本的近似内容。虽然代码 Embedding 的反向难度比自然语言更高(代码结构更复杂),但"Embedding 完全安全"这个假设并不成立。
对个人项目和开源代码来说,这些信息泄漏的影响几乎为零。
但对安全要求最高的场景——国防系统、金融核心交易系统、医疗数据处理——即使不能还原代码原文,能推断出系统的功能领域和架构模式本身就构成安全风险。如果攻击者知道你的支付系统用了哪种架构模式、知道哪些模块最近在改动,这些信息就是攻击面。
tcpdump 抓包验证:企业安审的实操流程

如果你是企业安审人员,或者你的公司要求验证 AI 编程工具的数据流向——下面是一个可以实际执行的验证流程:
步骤 1:抓取 wescode 的出站流量
# macOS / Linux
# 启动 tcpdump,只抓 wescode 相关进程的 TCP 流量
# 先找到 wescode 后端进程的 PID
ps aux | grep wescode
# 抓取所有出站 TCP 连接(排除本地回环)
sudo tcpdump -i any -n 'tcp and not host 127.0.0.1' \
-w wescode_traffic.pcap &
# 正常使用 wescode 10 分钟——对话、代码补全、搜索
# 做你平常做的操作
# 停止抓包
sudo kill %1
步骤 2:分析出站目标
# 提取所有出站目标 IP 和端口
tcpdump -r wescode_traffic.pcap -n 'dst port 443' | \
awk '{print $5}' | sort -u
# 你应该只看到模型供应商的 IP 地址:
# api.openai.com → 104.18.x.x 系列
# api.anthropic.com → 104.18.x.x 系列
# api.deepseek.com → 相应 IP
步骤 3:对比验证——用 Cursor 做同样的操作
# 对 Cursor 做同样的抓包
sudo tcpdump -i any -n 'tcp and not host 127.0.0.1' \
-w cursor_traffic.pcap &
# 使用 Cursor 10 分钟
sudo kill %1
# 分析 Cursor 的出站目标
tcpdump -r cursor_traffic.pcap -n 'dst port 443' | \
awk '{print $5}' | sort -u
# 你会看到除了模型供应商之外,还有 Cursor 自己的服务器 IP
步骤 4:零出站验证(本地模型模式)
# 配置 wescode 使用本地 Ollama
# 然后重复抓包步骤
sudo tcpdump -i any -n 'tcp and not host 127.0.0.1' \
-w wescode_local_traffic.pcap &
# 使用 wescode + Ollama 10 分钟
sudo kill %1
# 分析——应该看到零出站连接(排除系统自身的 DNS 等)
tcpdump -r wescode_local_traffic.pcap -n 'dst port 443' | wc -l
# 预期输出:0
这是可复现的验证——任何安审人员都可以执行这个流程,用客观的网络流量数据来验证"代码有没有出去"。
不同安全级别场景的推荐方案
不是所有场景都需要"零出站"——过度防御和防御不足一样有害(因为过度防御通常导致"根本不用")。
| 安全级别 | 典型场景 | 推荐方案 | 理由 |
|---|---|---|---|
| Level 1:个人/开源 | 个人项目、开源项目 | 任意工具 + Privacy Mode | 代码本来就是公开的,隐私风险极低 |
| Level 2:普通企业 | 一般商业代码、SaaS 产品 | Copilot Business 或 wescode BYOK | Privacy Mode + 不训练承诺对大多数企业已足够 |
| Level 3:严格合规 | 金融代码、政企系统 | wescode BYOK(直连模式) | 代码不经第三方服务器,可通过 tcpdump 审计 |
| Level 4:最高安全 | 国防、核心交易、医疗数据 | wescode + 本地模型(零出站) | 代码全程不离开设备,可物理断网验证 |
Level 2 和 Level 3 之间的分界线在于:你的公司是否有"代码不得传输到第三方服务"的安全策略。如果有——那么 Cursor 即使开了 Privacy Mode 也过不了(因为代码仍经过 Cursor 后端)。这种情况下需要 Level 3 的方案。
Level 3 和 Level 4 之间的分界线在于:你是否需要"可证明的零出站"。Level 3 的 BYOK 直连仍然有网络出站(到模型供应商),你需要信任供应商不会持久存储或滥用你的 prompt。Level 4 的本地模型则完全消除了这个信任依赖。
对你意味着什么
如果你是个人开发者、开源项目:
- Cursor 的 Privacy Mode 承诺不用于训练、不持久存储明文——对个人来说已经是合理的安全承诺
- 通义灵码、Trae 的数据在国内服务器处理,合规上比走海外更友好
- 选工具的首要考虑不是隐私,是功能和价格
如果你是公司员工:
- 看公司的安全政策。很多公司有"代码不得传输到第三方服务"的规定
- Cursor 的"请求经过后端"这一条大概率过不了严格的安审——不是技术问题,是流程问题
- 免费不等于安全——Trae 免费,但代码仍然经过字节的服务端
如果你在金融、政企、医疗:
- "代码不出设备"是硬性要求。不管中间方怎么承诺"不存储不训练",代码经过第三方服务器本身就过不了合规
- 这种场景下只有两个选择:代码全程不出设备(wescode + 本地模型做到全程零出站),或者不用 AI 编程工具
- wescode 的零出站模式意味着:安审时你可以证明"没有任何网络请求离开过这台机器"——
tcpdump抓包即可验证
你能做什么
- 了解你工具的数据路径——不是看营销页面,是看隐私政策和官方 FAQ。Cursor 的关键文档在
cursor.com/privacy;Copilot 的在 GitHub Docs 的 Copilot Privacy 章节 - 开 Privacy Mode——如果你的工具有的话(Cursor、Copilot Business 都有)。不能防止代码经过后端,但能防止被用于训练
- 用
.cursorignore/.gitignore排除敏感文件——API 密钥、配置文件、内部文档这些不要被 AI 索引 - 如果公司有安审要求,提前确认——别等到安审的时候才发现你的代码一直在经过第三方服务器
- 要求供应商提供可验证的证据——"我们不存储"是承诺,
tcpdump抓包是证据。对安全要求高的场景,用技术手段验证比相信承诺更可靠
这篇不是在说"云端 AI 工具不安全"。对大多数场景,它们够安全。这篇想说的是:你至少应该知道代码去了哪里,而不是假设它哪也没去。
如果你需要"代码不出设备"——wescode 的五层安全架构做到了这一点:第 1-3 层(本地解析+本地索引+本地组装)确保代码不经中间方;第 4 层(BYOK 直连)确保请求直达供应商;第 5 层(本地模型)在需要时做到全程零出站。