Skip to content

观察:build-schemas.ts 读 authorable-surface.json 的 JSON.parse 无保护 —— 手编成非法 JSON 时抛栈而非给处方(与姊妹 reader 不对称) #5873

Description

@baozhoutao

范围外发现,记录于 #4663 的前提复验过程中(该单前提已被证伪,详见其评论)。观察类:不构成绕过,门禁照样红,只是诊断质量与同文件的姊妹路径不对称。

事实

packages/spec/scripts/build-schemas.ts 里有两个「读一个受字节纪律约束的committed 产物」的路径,保护程度不同:

读取对象 位置 JSON.parse 保护 形状校验
authorable-surface.base.json(锚点) readCommittedSurfaceBase() L951–982 有:try/catch❌ ... is not valid JSON (#5235) 有:baseRev 40-hex + Array.isArray(keys),并给出 git checkout -- / 重锚两条处方
authorable-surface.json(本体) L595–598 (L602 直接 surfaceDoc.keys.map(...))
// build-schemas.ts:595-598
if (fs.existsSync(AUTHORABLE_SURFACE_PATH)) {
  surfaceRaw = fs.readFileSync(AUTHORABLE_SURFACE_PATH, 'utf-8');
  surfaceDoc = JSON.parse(surfaceRaw) as AuthorableSurface;   // ← 未保护
}

实测

e2bfa6ce3(当日 origin/main)的 worktree 里,把 authorable-surface.json 末尾的 } 删掉(模拟一次手编翻车),跑 pnpm --filter @objectstack/spec check:authorable-surface:

EXIT=1
SyntaxError: Expected ',' or '}' after property value in JSON at position 311133 (line 7942 column 1)
    at JSON.parse (anonymous)
    at path (/…/packages/spec/scripts/build-schemas.ts:597:21)

即:退出码正确(1),但输出是一条 node 栈,而不是这套门禁一贯的「一句诊断 + 一句修法」。同样的破坏打在 .base.json 上,得到的是 ❌ authorable-surface.base.json is not valid JSON (#5235) 加两条处方。

keys 被改成非数组 / 含非字符串项时同理:L602 的 .map(...) / .replace(...) 抛 TypeError,红但无处方。

为什么归为观察类

建议修法(窄)

把 L595–598 对齐 readCommittedSurfaceBase():try/catch + Array.isArray(doc?.keys) 形状校验,失败时输出与字节比对分支(L1536–1546)同族的处方 —— 都是 pnpm --filter @objectstack/spec gen:schema。不需要新增任何语义,只是让这条路径和它的姊妹一样会说话。

关联:#4650(门禁本体)、#5235(锚点 reader,对照实现)、#4663(本发现的来源单)

Activity

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

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions