# Security Policy

## 这个项目不做什么

`pi-web-simple` 是**单机、单人、无鉴权**的本地工具。它按设计就不适合多用户或
公网部署：

- 服务端只绑定回环地址（`127.0.0.1`，见 `server/src/index.ts`），没有账号体系，
  也没有权限模型。
- 兜底的 `Host` / `Origin` 校验（`server/src/routes.ts`）只用来挡浏览器发起的
  跨源请求与 DNS rebinding，**不是一道认证边界**。
- 它能做的事包括：读写 pi 的会话文件与配置、作为 pi 子进程在项目目录里执行
  工具、枚举服务端所在机器的目录、真的启动 MCP 配置里的命令。

**不要把它暴露到公网，也不要用反向代理把非回环地址转发进来。** 任何能访问该
端口的人都能操作上述一切。

## 网络行为与数据落地

它连不连网、数据放在哪。除版本检查外，全部对外请求都由你显式触发：

| 时机 | 目标 | 说明 |
|---|---|---|
| 启动时 | `https://pi.dev/api/latest-version` | 与 pi CLI 启动时轮询的同一个端点，只做版本比较（见[更新提示为什么分两条路，而且都不代劳](./docs/design-notes.md#更新提示为什么分两条路而且都不代劳)） |
| 点「获取可用模型」 | 你配置的 provider 地址 | 用 `GET <baseUrl>/models` 拉取模型列表 |
| 点 MCP 的「检查」 | MCP 配置里的命令或地址 | **会真的启动那个 stdio 命令**或请求那个 URL，超时 15 秒 |
| 与模型对话 | 你配置的 provider | 会话内容按 pi 的正常行为发给模型 |

除此之外，服务端不联网、不埋点、不上报。它读到的东西都留在本机：会话正文只有 pi
一份（`~/.pi/agent/`，或 `PI_WEB_SIMPLE_SESSION_DIR` 指定的目录），项目记录与 UI 偏好
在 `~/.pi-web-simple/store.json`，模型的 API 密钥由 pi 自己管理（页面只写不读，见
[模型配置为什么在改文件](./docs/design-notes.md#模型配置为什么在改文件)）。目录浏览
（`/api/fs/*`）会枚举**服务端所在机器**的目录，但只列子目录名、不读文件内容。`@` 补全
的索引（`/api/projects/:id/files/search`）列出的是**项目目录内**的路径（`git ls-files`
过滤后的结果，或非 git 工作区一次有上限的遍历），同样只给路径、不读内容，且只对已经
在项目列表里的目录建立。

## 报告漏洞

如果你发现了安全问题，请**不要**直接开公开 issue。任选一种私密渠道：

1. GitHub 仓库的 **Security → Report a vulnerability**（私有 Security Advisory），
   这是首选方式。
2. 若仓库未开启该功能，用 issue 只写「需要私密渠道」，不要贴细节。

报告时请尽量给出：受影响版本或 commit、复现步骤、影响范围，以及你判断的严重
程度。这是一个个人维护的副项目，我会尽力在数天内响应，但无法承诺固定 SLA。

## 已知的、按设计存在的行为（不算漏洞）

- 无鉴权、无密码、无 CSRF token —— 见上。
- 上面「网络行为与数据落地」列出的全部对外请求，以及本地明文存储，都是设计的一部分：
  工具不额外加密，也不外发这些内容。
