Evan Hu
680fdfa648
fix(skin): 丢弃第三方皮肤 CSS 里的远程引用,不再原样注入候选窗
皮肤是用户往 %LOCALAPPDATA%\metasequoiaime\skins 里丢的文件夹,是彻头彻尾的第三方内容,而它的 CSS 会被内联进候选窗文档。此前 IsRewritableSkinCssUrl() 对含 :// 的 URL 直接返回 false,而 false 分支把原始 url("…") 原封不动写回样式表——也就是说 `background-image: url(https://attacker/beacon.png)` 会在每一次候选窗渲染时向外发一个请求,泄露「此人此刻正在打字」以及 IP。这直接推翻了 PRIVACY.md 的 "Local conversion never contacts the network",而那句话是这个项目最强的信任资产。
问题出在这个判断只有两态:不可重写就等于放行。实际上有三类:
- Embed——皮肤包内的相对路径,读文件内联;
- Keep——本身就是惰性的 data: 负载和文档内 #fragment 引用,照原样保留;
- Drop——任何会让候选窗向皮肤包之外取数据的写法。丢掉 URL 后声明不完整,CSS 会整条丢弃,这正是想要的结果。
Drop 覆盖 http/https/ftp 等带 scheme 的、协议相对的 //host/x(不写 scheme 但照样出网)、路径穿越,以及会逃出皮肤包的绝对路径。
url() 不是唯一入口:`@import "https://…"` 根本不含 url() token,扫描器永远看不到它。补 StripRemoteImports() 做前置处理,只删远程 @import,本地的保留。
skin.preview 来自皮肤自己的 skin.toml,此前直接进 EmbedSkinCssUrl。现在同样过一遍分类,不因为它是通过 manifest 字段到达就被信任。
判断逻辑抽到 server/src/webview2/skin_css_policy.{h,cpp},不依赖任何 Windows API,配 6 个用例覆盖三类判定与两种 @import 写法。本机以 -Wall -Wextra 编译运行全部通过。
2026-09-06 18:05:09 +09:00
..
2026-06-20 22:11:00 +08:00
2026-09-06 12:13:47 +09:00
2026-09-06 13:24:03 +09:00
2026-09-02 15:30:03 +08:00
2026-09-06 12:13:47 +09:00
2026-07-16 21:41:09 +08:00
2026-07-16 21:41:09 +08:00
2026-09-06 12:13:47 +09:00
2026-09-06 00:26:38 +09:00
2026-09-06 12:13:47 +09:00
2026-09-06 12:13:47 +09:00
2026-08-30 15:39:02 +08:00
2026-09-06 12:13:47 +09:00
2026-09-06 11:56:11 +09:00
2026-08-25 11:58:33 +08:00
2026-09-06 12:13:47 +09:00
2026-09-06 15:31:05 +09:00
2026-09-06 12:13:47 +09:00
2026-08-08 12:37:24 +08:00
2026-09-06 12:13:47 +09:00
2026-08-25 19:05:25 +08:00
2026-09-06 10:31:48 +09:00
2026-09-06 12:13:47 +09:00
2026-09-06 12:13:47 +09:00
2026-09-06 12:13:47 +09:00
2026-09-06 12:13:47 +09:00
2026-07-16 21:41:09 +08:00
2026-07-16 21:41:09 +08:00
2026-09-06 12:13:47 +09:00
2026-09-06 12:13:47 +09:00
2026-08-16 03:04:02 +08:00
2026-09-02 16:40:46 +08:00
2026-09-06 18:05:09 +09:00
2026-08-01 15:33:00 +08:00
2026-09-06 12:13:47 +09:00
2026-08-25 20:01:48 +08:00
2026-09-06 12:13:47 +09:00
2026-09-06 04:35:40 +09:00
2026-09-06 12:13:47 +09:00
2026-08-21 12:58:40 +08:00
2026-07-13 18:35:52 +08:00