fix: 全面审计修复 — 键盘/印章库/右键/资源/CSP 加固 #1

Open
wenpai wants to merge 4 commits from fix/audit-hardening into master
First-time contributor

概述

4 路并行子代理审计(core / modules / wiring+UI / security)交叉验证后修复 8 类问题,11 文件。

修复清单

HIGH

  • 键盘快捷键在输入框内误触发(main.js): 坐标框 Backspace 误删印章、方向键误移、旋转框负号无法输入、文本框 Ctrl+C/V/S 被劫持 → handler 开头加焦点守卫(INPUT/TEXTAREA/SELECT/contenteditable/isComposing → return)
  • 印章库脏 localStorage 崩溃(seal-library.js): getSavedSeals 不校验数组,脏数据打死读/写/渲染三条路径 → Array.isArray 校验 + 逐项过滤 + 格式异常自动重置

MED

  • 印章加载假报成功(seal-library.js): loadAndApplySeal 无 onerror 且成功 toast 在 onload 外同步弹 → toast 移入 onload、补 onerror
  • 右键菜单作用于错误对象(canvas-manager.js/context-menu.js): 开 fireRightClick/stopContextMenu,菜单前 findTarget 命中置活动对象
  • 触摸手势死代码 + 常驻 MutationObserver(responsive.js): 移除永不生效的 _canvas 触摸链和 body 全子树 observer(fabric 自带触摸兜底)

LOW

  • blob URL 下载失败(exporter/batch-processing/batch-operations/settings ×5): click() 后立即 revoke → 改延迟撤销
  • 批处理下载名未 sanitize(batch-processing.js): 统一 generateSafeExportFilename

加固

  • CSP 加 object-src 'none'; frame-ancestors 'none'(index.html)
  • escapeHtml() 纵深防御(security.js)
  • 删除遗留 tmp-global-patch-test-a.js

刻意不改(附理由,见 docs/AUDIT-2026-07-21.md)

exporter 恒 degrees(0)(旋转烘焙进位图+lockRotation:true不可触发) / state.js 浅拷贝(已 new Set 防御) / seal id 毫秒碰撞(极难触发) / pdf.js isEvalSupported(CSP 已拦 eval) / SVG 白名单(不可利用,保留功能) / 移除 script-src 'unsafe-inline'(需搬内联脚本有回归风险,后续单独处理)

安全结论

未发现可实际利用的 XSS/注入。防护可信,源于全程 textContent 渲染不可信数据的编码纪律。

验证

语法全检 + 5 条功能流回归(盖章/签名/批量队列/批量端到端/UI 截图) + 无 CSP 违规,全绿。

详见 docs/AUDIT-2026-07-21.md · cluster-recall #5785

🤖 Generated with Claude Code

## 概述 4 路并行子代理审计(core / modules / wiring+UI / security)交叉验证后修复 8 类问题,11 文件。 ## 修复清单 ### HIGH - **键盘快捷键在输入框内误触发**(main.js): 坐标框 Backspace 误删印章、方向键误移、旋转框负号无法输入、文本框 Ctrl+C/V/S 被劫持 → handler 开头加焦点守卫(INPUT/TEXTAREA/SELECT/contenteditable/isComposing → return) - **印章库脏 localStorage 崩溃**(seal-library.js): `getSavedSeals` 不校验数组,脏数据打死读/写/渲染三条路径 → `Array.isArray` 校验 + 逐项过滤 + 格式异常自动重置 ### MED - **印章加载假报成功**(seal-library.js): `loadAndApplySeal` 无 onerror 且成功 toast 在 onload 外同步弹 → toast 移入 onload、补 onerror - **右键菜单作用于错误对象**(canvas-manager.js/context-menu.js): 开 `fireRightClick`/`stopContextMenu`,菜单前 `findTarget` 命中置活动对象 - **触摸手势死代码 + 常驻 MutationObserver**(responsive.js): 移除永不生效的 `_canvas` 触摸链和 body 全子树 observer(fabric 自带触摸兜底) ### LOW - **blob URL 下载失败**(exporter/batch-processing/batch-operations/settings ×5): `click()` 后立即 revoke → 改延迟撤销 - **批处理下载名未 sanitize**(batch-processing.js): 统一 `generateSafeExportFilename` ### 加固 - CSP 加 `object-src 'none'; frame-ancestors 'none'`(index.html) - 补 `escapeHtml()` 纵深防御(security.js) - 删除遗留 `tmp-global-patch-test-a.js` ## 刻意不改(附理由,见 docs/AUDIT-2026-07-21.md) exporter 恒 `degrees(0)`(旋转烘焙进位图+`lockRotation:true`不可触发) / state.js 浅拷贝(已 `new Set` 防御) / seal id 毫秒碰撞(极难触发) / pdf.js `isEvalSupported`(CSP 已拦 eval) / SVG 白名单(不可利用,保留功能) / 移除 `script-src 'unsafe-inline'`(需搬内联脚本有回归风险,后续单独处理) ## 安全结论 未发现可实际利用的 XSS/注入。防护可信,源于全程 `textContent` 渲染不可信数据的编码纪律。 ## 验证 语法全检 + 5 条功能流回归(盖章/签名/批量队列/批量端到端/UI 截图) + 无 CSP 违规,全绿。 详见 `docs/AUDIT-2026-07-21.md` · cluster-recall #5785 🤖 Generated with [Claude Code](https://claude.com/claude-code)
4 路并行审计(core/modules/UI/security)交叉验证后修复:

HIGH
- main.js: 键盘快捷键加输入框焦点守卫,修复坐标框 Backspace 误删印章、
  方向键误移、旋转框负号无法输入、文本框 Ctrl+C/V/S 被劫持
- seal-library.js: getSavedSeals 校验数组+逐项过滤脏数据,防脏 localStorage
  打死印章库读/写/渲染三条路径

MED
- seal-library.js: loadAndApplySeal 补 onerror,成功 toast 移入 onload,
  修复图片损坏时假报成功+state 静默不一致
- canvas-manager.js/context-menu.js: 开 fireRightClick,右键前 findTarget
  命中置活动对象,修复右键菜单不出现/作用于旧对象
- responsive.js: 移除永不生效的 _canvas 触摸手势死代码 + body 全子树
  MutationObserver 常驻空转(fabric 自带触摸兜底)

LOW
- exporter/batch-processing/batch-operations/settings: blob URL 延迟撤销,
  修复部分浏览器下载失败
- batch-processing.js: 下载名统一走 generateSafeExportFilename

加固
- index.html: CSP 加 object-src 'none'; frame-ancestors 'none'
- security.js: 补 escapeHtml() 纵深防御
- 删除遗留 tmp-global-patch-test-a.js

验证: 语法全检 + 5 条功能流回归(盖章/签名/批量/端到端/截图) + 无 CSP 违规

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
记录 4 路并行审计发现、修复清单、刻意不改项及理由、安全结论、通用教训。
配套 cluster-recall #5785。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- docs/DEPLOY.md: 阿里云 OSS/COS + CDN 部署流程,含前置条件(域名/备案/
  AK/DNS 归属)、部署包白名单、分层缓存策略、上线验收清单、腾讯云/CF 备选
- deploy.sh: 只同步白名单文件(index.html/src/vendor/public)到 OSS,
  按资源类型设缓存头(vendor 长缓存/app 代码 no-cache),支持 --dry-run

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 工具栏头部加可见的撤销/重做按钮(#undoBtn/#redoBtn),接 window.History
  undo/redo;此前该两 id 只被 updateUndoRedoButtons 引用却不存在于 DOM,
  撤销/重做只能靠 Ctrl+Z/Y 或右键,发现性差。按钮 disabled 态随命令栈联动。
- 骑缝章位置从硬编码 top:400 改为按页面实际高度垂直居中
  (max(0,(originalHeight-scaledPieceHeight)/2)),修复小页面出界/不同尺寸
  页位置不一致(审计 M1)。

验证(CDP 实测): 按钮初始禁用→命令入栈→undo 启用/redo 禁用→点撤销翻转→
点重做翻转,全部正确;骑缝片 top=(1584-245)/2=670 精确居中、在界内、非 400。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin fix/audit-hardening:fix/audit-hardening
git switch fix/audit-hardening

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch master
git merge --no-ff fix/audit-hardening
git switch fix/audit-hardening
git rebase master
git switch master
git merge --ff-only fix/audit-hardening
git switch fix/audit-hardening
git rebase master
git switch master
git merge --no-ff fix/audit-hardening
git switch master
git merge --squash fix/audit-hardening
git switch master
git merge --ff-only fix/audit-hardening
git switch master
git merge fix/audit-hardening
git push origin master
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Modiqi-com/yinji!1
No description provided.