Skip to content

修复移动端首屏并加固安全配置#133

Open
Hill-1024 wants to merge 1 commit into
lehhair:mainfrom
Hill-1024:codex/mobile-security-hardening
Open

修复移动端首屏并加固安全配置#133
Hill-1024 wants to merge 1 commit into
lehhair:mainfrom
Hill-1024:codex/mobile-security-hardening

Conversation

@Hill-1024

Copy link
Copy Markdown

背景

这次修复来自对 OpenCodeUI 的一次前端问题排查与安全检查。检查过程中发现三个可以独立改善的问题:

  1. 移动端首屏可能被侧边栏展开状态带偏,导致打开页面时没有优先展示聊天主界面。
  2. package-lock.json 中存在 npm audit 可识别、可自动修复的 transitive dependency 漏洞版本。
  3. Tauri 桌面端配置中 security.cspnull,等于关闭 WebView 的 Content Security Policy,防护边界偏弱。

本 PR 对这三点做了集中修复。

修复内容与修复方式

1. 修复移动端首屏误停在左侧栏

问题原因

移动端布局使用 pager 在左侧栏、聊天区、右侧面板之间切换。原逻辑在移动端初始化时会根据 sidebarExpanded 决定应该滚动到哪个页面:

  • rightPanelOpen 为 true 时进入右侧面板;
  • 否则如果 sidebarExpanded 为 true,就进入左侧栏;
  • 否则进入聊天页。

这在桌面状态和移动状态复用同一个侧边栏展开状态时会出问题:如果侧边栏状态为默认展开,或者来自持久化状态,移动端首次进入时就会直接停在左侧栏,聊天主区域被挤到屏幕外。

修复方式

src/App.tsx 中调整移动端 pager 初始化逻辑:

  • 增加 isInitializing 判断,区分首次初始化和后续交互同步。
  • 首次进入移动端布局时,除非右侧面板已经显式打开,否则优先定位到 chat 页面。
  • 首次移动端初始化完成后,如果没有打开右侧面板,则同步调用 setSidebarExpanded(false),避免桌面侧边栏展开状态继续影响移动端首屏。
  • 保留后续用户主动打开侧边栏、切换右侧面板时的既有行为。

这样移动端首次打开时会稳定展示聊天主界面,同时不破坏侧边栏按钮的正常交互。

影响文件:

  • src/App.tsx

2. 修复 npm audit 发现的依赖漏洞

问题原因

使用 npm 官方 registry 执行安全审计时,package-lock.json 中存在可修复的 transitive dependency 漏洞版本,涉及:

  • @babel/core
  • dompurify
  • js-yaml
  • undici

这些依赖虽然不是全部由项目直接声明,但 lockfile 会决定 npm ci / npm install 的实际安装版本,因此仍然会影响本地开发、CI 和打包环境的依赖安全状态。

修复方式

执行:

npm_config_registry=https://registry.npmjs.org npm audit fix

修复结果:

  • 仅更新 package-lock.json 中的解析版本。
  • 未修改 package.json 的直接依赖声明。
  • 修复后重新执行 audit,结果为 0 vulnerabilities

影响文件:

  • package-lock.json

3. 启用 Tauri WebView CSP

问题原因

原配置中:

"security": {
  "csp": null
}

这会关闭 Tauri WebView 的 Content Security Policy。考虑到 OpenCodeUI 会渲染后端/模型返回的 Markdown、Mermaid/SVG 等内容,同时 Tauri 环境中存在 HTTP、文件和 bridge 能力,关闭 CSP 会降低 WebView 注入类问题出现时的防护能力。

这不是一个已经验证出可直接利用的 XSS 漏洞,但属于明显的安全加固点:即使当前 Markdown 渲染链路已有 sanitize/harden 和 Mermaid strict mode,CSP 仍然应作为额外防线存在。

修复方式

src-tauri/tauri.conf.json 中的 csp: null 替换为显式 CSP:

  • default-src 'self'
  • script-src 'self' 'wasm-unsafe-eval'
  • style-src 'self' 'unsafe-inline'
  • 允许必要的 img-srcfont-srcconnect-srcmedia-srcframe-src
  • 增加 object-src 'none'
  • 增加 base-uri 'self'

这个策略保留应用当前运行所需的 Tauri IPC、wasm、样式、图片、字体、HTTP/HTTPS、WebSocket、媒体和 frame 场景,同时恢复浏览器层面的基础安全约束。

影响文件:

  • src-tauri/tauri.conf.json

安全检查结果

修复后对当前工作树重新做了安全检查,结论是:当前改动范围内没有未修复的 reportable security finding。

检查中还记录了两个后续可选加固方向,但不作为本 PR 的阻塞项:

  • Docker 后端镜像 / entrypoint 中的远程 installer 后续可以做版本 pin 或 checksum 校验。
  • Tauri http / fs capability 后续可以根据实际产品需求进一步收窄。

验证

已执行并通过:

npm ci
npm run validate
npm_config_registry=https://registry.npmjs.org npm audit --audit-level=moderate
git diff --check

验证结果:

  • npm run validate 通过。
  • Vitest:70 个测试文件通过,327 个测试通过。
  • Production build 完成。
  • npm audit --audit-level=moderate 结果为 0 vulnerabilities
  • git diff --check 干净。
  • src-tauri/tauri.conf.json 可被 JSON 解析。
  • npx tauri info 可以读取配置并显示新的 CSP。

另外做过浏览器 QA:

  • 桌面视口 1280x720:应用可正常渲染,设置弹窗可打开。
  • 移动视口 390x844:首屏进入聊天页,侧边栏按钮仍可正常打开。

备注:浏览器 QA 时未启动 OpenCode backend,因此控制台里连接 127.0.0.1:4096 的 fetch/SSE 报错属于预期现象。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant