其他
当无效数据导致深层执行失败时,按数据流在入口、业务逻辑…
适用于无效数据经过多个系统层后引发深层失败、单点校验容易被不同代码路径、重构或 mock 绕过的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 48/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 57/100 ×0.15
适用场景
当无效数据导致深层执行失败时,按数据流在通用
解决思路
- 修复无效数据引发的 bug 时,在数据经过的每一层都加校验,让 bug 在结构上不可能发生,而不是只修一个点。
- 设计多层校验:入口校验捕获大多数 bug。
- 设计多层校验:业务逻辑校验捕获边界情况。
- 设计多层校验:环境守卫阻止特定上下文中的危险操作。
- 设计多层校验:调试插桩在其他层失效时帮助定位。
- Layer 1 入口点校验:在 API 边界拒绝明显无效输入;例如 createProject(name, workingDirectory) 中,检查 !workingDirectory || workingDirectory.trim() === '' 并抛错,检查 !existsSync(workingDirectory) 并抛错,检查 !statSync(workingDirectory).isDirectory() 并抛错,然后才继续。
- Layer 2 业务逻辑校验:确保数据对当前操作有意义;例如 initializeWorkspace(projectDir, sessionId) 中,检查 !projectDir 并抛错,然后才继续。
- Layer 3 环境守卫:防止在特定上下文中执行危险操作;例如 gitInit(directory) 中,当 process.env.NODE_ENV === 'test' 时,计算 normalize(resolve(directory)) 和 normalize(resolve(tmpdir())),若目标不以临时目录开头则抛错,拒绝在测试中于临时目录外执行 git init。
- Layer 4 调试插桩:捕获用于事后取证和定位的上下文;例如 gitInit(directory) 中,先取 const stack = new Error().stack,再 logger.debug('About to git init', { directory, cwd: process.cwd(), stack }),然后继续执行。
- 发现 bug 时,追踪数据流:确定坏值从哪里产生、在哪里被使用。
- 映射所有检查点:列出数据经过的每一个点。
- 在每一层添加校验:入口、业务逻辑、环境、调试插桩。
- 测试每一层:尝试绕过 Layer 1,验证 Layer 2 能捕获。
- 参考会话案例:空 projectDir 导致在源码目录执行 git init;数据流为 test setup → 空字符串 → Project.create(name, '') → WorkspaceManager.createWorkspace('') → git init 在 process.cwd() 运行。
- 在该案例中添加四层:Layer 1 在 Project.create() 校验非空、存在、可写。
- 在该案例中添加四层:Layer 2 在 WorkspaceManager 校验 projectDir 非空。
- 在该案例中添加四层:Layer 3 在 WorktreeManager 于测试中拒绝在 tmpdir 外执行 git init。
- 在该案例中添加四层:Layer 4 在 git init 前记录 stack trace。
- 确认四层都必要:测试不同代码路径绕过入口校验的情况。
- 确认四层都必要:测试 mock 绕过业务逻辑检查的情况。
- 确认四层都必要:测试不同平台边界情况需要环境守卫的情况。
- 确认四层都必要:测试调试日志识别结构性误用的情况。
- 不要停留在一个校验点;在每一层都加检查。
- 将同样分层方法用于安全防御:信任不在单点授予,使任一层 bug 或绕过不能单独攻破系统。
- 安全上让每个请求在边缘、处理器、数据层独立检查。
- 安全 Layer 1(边缘):在边缘限流和过滤(CDN/WAF,如 Cloudflare 或 AWS WAF),让滥用流量到不了源站。
- 安全 Layer 2(处理器):在服务端从 session 重新推导授权,绝不相信客户端提供的声明,例如 body 里的 userId;例如使用 verifySession(req.cookies.session),无效则抛错。
- 安全 Layer 3(数据):在数据库查询中强制所有权不变量,即使处理器有 bug 也不能跨租户;例如执行 UPDATE docs SET title = $1 WHERE id = $2 AND owner_id = $3 RETURNING *,用 user.id 作为 owner_id,若无更新行则返回 403 Not allowed。
- 应用防御纵深原则时,确保任何单层失败都不足以攻破系统。
适用边界 · 注意事项
- 如果数据只在一个封闭函数内产生和消费,且没有外部输入、跨层传递或可绕过路径,不必在每层机械重复相同校验。
- 如果性能极端敏感且每层校验成本高,应集中或缓存昂贵校验,而不是无差别复制。
- 不要用多层校验替代修复根因(如错误默认值或类型设计);它用于让 bug 结构上不可能,而不是掩盖错误。