这个面板的安全模型很简单,也很硬:它假设只有你本机的你能碰到那个端口。 下面说清楚这个假设意味着什么,以及越出它会发生什么。
- 服务只绑
127.0.0.1(开发vite.config.mjs,生产server/prod.mjs),没有对外网卡监听。 - 没有任何鉴权,也没有 Origin / CORS 校验。 谁能连上那个端口,谁就能调
/api/*。 - 这意味着:你本机浏览器里打开的任意一个网页都可以向
http://127.0.0.1:5050发请求。 浏览器能发出请求,也能读到响应——同源策略拦的是读,不拦发(简单 POST 不带预检)。 因此这些接口是可以被第三方页面触发的:POST /api/open—— 用指定或系统默认应用打开一个路径/URLPOST /api/copy—— 往系统剪贴板写文本POST /api/pick—— 弹出 macOS 原生选择器(会阻塞一个请求位)POST /api/run—— 后台启动一条已存好的命令
- 数据全在
data/items.json一个明文文件里,不加密、不含凭证。请不要把 token、密码之类写进条目值或备注。
不是"防黑客",是防误用和防注入:
POST /api/run只接受id,命令文本从服务端存储里取。请求体里传不进来任何命令内容,所以外部页面顶多触发一条你自己写过的命令,不能凭空注入一条。POST /api/terminal只接受已经在settings.terminals清单里的.app路径,清单外的应用一律拒绝。同理,所有路径类字段要求绝对路径,读盘条目的id/kind/tags入库前都清洗。
命令本身以 $SHELL -i -c 在 ~ 下执行——这是设计如此(要拿到你的 alias 和 PATH),
也就是说:面板里那条命令的权限就等于你的登录 shell 的权限。 别放提权的、别放来源不明的片段。
- 不要把端口反向代理出去(nginx / frp / cloudflared / SSH -R 都算),也不要挂公网。 这个服务没有为多用户或不可信网络设计过,一旦可被远端访问,等价于把"以你的身份执行命令"开放给对方。
- 不要在公共 / 办公 Wi-Fi 上开着面板再浏览别的网站。
- 不要手改
data/items.json(会被内存里的整表覆盖,还可能漏字段让构建后的界面白屏)。
这个项目只有一个维护者,没有安全团队,也不设私密邮箱。请这样做:
- 开一个 issue,标题写「安全问题」,正文里不要写细节——只说存在哪一类风险、影响哪个接口,让我知道该往哪看。
- 我会把它转成 GitHub 的私密 security advisory,再在里面对话。
- 细节(POC、请求体、截图)留到私密渠道里再给。
不要直接提一个"修漏洞"的公开 PR 把细节写在 diff 里——那样在你我都还没准备好的时候,漏洞就已经写在公开历史里了。
修复节奏没有承诺。我会尽快,但这是一个个人项目;如果几周没动静,可以在原 issue 下礼貌地问一次。