[ PROMPT_NODE_25540 ]
defense-in-depth
[ SKILL_DOCUMENTATION ]
# 纵深防御验证
## 概述
当你修复一个由无效数据引起的 Bug 时,在一个地方添加验证感觉足够了。但该单一检查可能会被不同的代码路径、重构或 Mock 所绕过。
**核心原则:** 在数据经过的每一层进行验证。使 Bug 在结构上变得不可能。
## 为什么需要多层
单层验证:“我们修复了 Bug”
多层验证:“我们使 Bug 变得不可能”
不同的层捕获不同的情况:
- 入口验证捕获大多数 Bug
- 业务逻辑捕获边缘情况
- 环境守卫防止特定上下文的危险
- 调试日志在其他层失败时提供帮助
## 四个层级
### 第 1 层:入口点验证
**目的:** 在 API 边界拒绝明显无效的输入
typescript
function createProject(name: string, workingDirectory: string) {
if (!workingDirectory || workingDirectory.trim() === '') {
throw new Error('workingDirectory 不能为空');
}
if (!existsSync(workingDirectory)) {
throw new Error(`workingDirectory 不存在: ${workingDirectory}`);
}
if (!statSync(workingDirectory).isDirectory()) {
throw new Error(`workingDirectory 不是一个目录: ${workingDirectory}`);
}
// ... 继续
}
### 第 2 层:业务逻辑验证
**目的:** 确保数据对于此操作是有意义的
typescript
function initializeWorkspace(projectDir: string, sessionId: string) {
if (!projectDir) {
throw new Error('工作区初始化需要 projectDir');
}
// ... 继续
}
### 第 3 层:环境守卫
**目的:** 防止在特定上下文中进行危险操作
typescript
async function gitInit(directory: string) {
// 在测试中,拒绝在临时目录之外进行 git init
if (process.env.NODE_ENV === 'test') {
const normalized = normalize(resolve(directory));
const tmpDir = normalize(resolve(tmpdir()));
if (!normalized.startsWith(tmpDir)) {
throw new Error(
`测试期间拒绝在临时目录之外进行 git init: ${directory}`
);
}
}
// ... 继续
}
### 第 4 层:调试工具
**目的:** 捕获取证上下文
typescript
async function gitInit(directory: string) {
const stack = new Error().stack;
logger.debug('准备进行 git init', {
directory,
cwd: process.cwd(),
stack,
});
// ... 继续
}
## 应用模式
当你发现 Bug 时:
1. **追踪数据流** - 错误值源自何处?在哪里被使用?
2. **M**