Skip to content

🔒 fix(sdk): 表格 span 预算提升为文档级全局计数 (#458) - #461

Merged
CavinHuang merged 3 commits into
mainfrom
fix/458-span-budget-global
Aug 22, 2026
Merged

🔒 fix(sdk): 表格 span 预算提升为文档级全局计数 (#458)#461
CavinHuang merged 3 commits into
mainfrom
fix/458-span-budget-global

Conversation

@CavinHuang

Copy link
Copy Markdown
Owner

问题

PR#428 为 HTML→Markdown 表格归一化加的展开预算作用域是 per-table 的:单张表的 rowspan/colspan 展开被限制在 25 万格内,但 normalizeTablesHtml 对每张表独立施加预算,循环间无任何文档级累计。攻击页面只需包含任意多张合法小表(每张 <td rowspan="100" colspan="100"> 约 52 字节、展开 1 万格),即可让展开格总量无上界,OOM 路径依旧可达。

修复

  • 文档级全局计数器buildTableGrid 现在返回本表实际展开格数;normalizeTablesHtml 在循环外维护跨表累计的 documentCells,超过 MAX_DOCUMENT_TABLE_CELLS(25 万,与单表上限同值)后当前表及后续所有表全部跳过归一化。任意输入的展开物化总量从此有硬上界。
  • 截断可观测:预算耗尽时向输出注入 [table span budget reached: N table(s) left unnormalized] 段落标记,流经 Turndown 成为最终 Markdown 中的可见文本。跳过的表仍以原始形式进入转换,内容不丢失——标记告知下游哪些表未做合并单元格展开。

测试

新增 document-level span budget (#458) 三用例:

  1. 多表组合反例(核心):26 张合法小表,前 25 张恰好填满文档级预算仍全部展开(上边界合法),第 26 张触发截断——断言其保留原始 span 属性、内容仍在输出中、标记文本精确为 1 张未归一化;
  2. 边界:恰好填满预算的 25 张全部展开且无标记;
  3. 单表超限(per-table 路径)同样计入截断标记。

既有 ( #303) 预算测试不回归。

验证

Fixes #458

🤖 Generated with Claude Code

TaTaLiao and others added 3 commits August 22, 2026 22:31
PR#428 的单表预算作用域错误:单表合法的 rowspan/colspan 展开可被任意
多张小表叠加,展开格总量仍无上界,OOM 路径依旧可达。

- buildTableGrid 返回本表格数,normalizeTablesHtml 维护跨表累计的
  文档级预算(MAX_DOCUMENT_TABLE_CELLS=250k),超限表跳过归一化且
  后续表全部跳过,展开物化总量从此有界
- 截断可观测:预算耗尽后向输出注入 [table span budget reached: N
  table(s) left unnormalized] 标记,流经 Turndown 成为可见文本,
  不静默丢内容(跳过的表仍以原始形式进入转换)
- 测试钉死:26 张合法小表组合反例(第 26 张被截+内容保留+标记)、
  恰好填满预算的 25 张全展开边界、单表超限同样产生标记

Fixes #458

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@CavinHuang
CavinHuang merged commit c5dd512 into main Aug 22, 2026
4 checks passed
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.

🐛 [P0] web 抓取 span 预算 per-table 可绕过——PR#428 的 #303 修复作用域错误,OOM 依旧可达

2 participants