name: 安全审计 description: RLS验证、安全审计、OWASP合规性和漏洞扫描。用于验证RLS策略、审计API路由、扫描安全漏洞或检查代码中的漏洞。
安全审计技能
目的
指导安全验证,包括RLS执行、OWASP合规性和漏洞检测,遵循安全优先的架构。
当此技能适用时
- 验证RLS策略
- 审计API路由以进行认证
- 漏洞扫描
- 预部署安全审查
- 检查暴露的凭据
- 审查数据库访问模式
禁止的条件
禁止模式
// 禁止:直接Prisma调用(绕过RLS)
const users = await prisma.user.findMany();
// 必须使用:withUserContext、withAdminContext或withSystemContext
// 禁止:受保护路由缺少认证
export async function GET(req: Request) {
// 访问用户数据前未进行认证检查
return getUserData();
}
// 禁止:暴露的凭据
const API_KEY = "sk_live_abc123"; // 硬编码的密钥
// 禁止:SQL注入漏洞
const query = `SELECT * FROM users WHERE id = ${userId}`; // 插值
正确模式
// 正确:RLS上下文包装器
const users = await withUserContext(prisma, userId, async (client) => {
return client.user.findMany();
});
// 正确:数据访问前的认证检查
export async function GET(req: Request) {
const { userId } = await auth();
if (!userId) {
return new Response("未授权", { status: 401 });
}
return getUserData(userId);
}
// 正确:环境变量用于密钥
const API_KEY = process.env.STRIPE_SECRET_KEY;
// 正确:参数化查询
const user = await prisma.$queryRaw`SELECT * FROM users WHERE id = ${userId}`;
安全审计检查清单
1. RLS验证
- [ ] 所有数据库操作使用上下文包装器
- [ ] 路由处理程序中无直接Prisma调用
- [ ] 用户隔离已验证(用户A无法看到用户B的数据)
- [ ] 管理员操作正确限定范围
# 查找潜在的RLS绕过
grep -r "prisma\." --include="*.ts" app/ lib/ | grep -v "withUserContext\|withAdminContext\|withSystemContext"
2. 认证检查
- [ ] 所有受保护路由验证认证
- [ ] 在数据访问前调用认证提供者auth()
- [ ] 为未授权提供适当的401/403响应
# 查找缺少认证检查的路由
grep -r "export async function" --include="route.ts" app/ | head -20
# 手动验证每个都有认证检查
3. 凭据扫描
- [ ] 代码中无硬编码密钥
- [ ] 客户端代码中无API密钥
- [ ] 正确使用环境变量
# 扫描潜在密钥
grep -rE "(sk_live|pk_live|password|secret|key)" --include="*.ts" --include="*.tsx" | grep -v "process.env\|.env"
4. 依赖项漏洞
# 运行安全审计
npm audit
yarn audit
# 检查高/严重漏洞
npm audit --audit-level=high
5. 输入验证
- [ ] 用户输入使用Zod模式验证
- [ ] 无原始查询插值
- [ ] 文件上传限制已就位
OWASP Top 10检查清单
| 风险 | 检查 | 状态 |
|---|---|---|
| A01 破损的访问控制 | RLS已执行,所有路由有认证 | ☐ |
| A02 加密失败 | 密钥仅存于环境变量 | ☐ |
| A03 注入 | 参数化查询,Zod | ☐ |
| A04 不安全的设计 | 遵循认证优先模式 | ☐ |
| A05 错误配置 | 生产环境正确保护 | ☐ |
| A06 易受攻击的依赖项 | npm审计清洁 | ☐ |
| A07 认证失败 | 认证集成正确 | ☐ |
| A08 数据完整性 | RLS防止篡改 | ☐ |
| A09 日志记录失败 | 安全事件已记录 | ☐ |
| A10 SSRF | 外部URL已验证 | ☐ |
安全验证命令
# 完整安全检查
npm audit && yarn lint && echo "安全检查通过"
# RLS绕过检测
grep -r "prisma\." --include="*.ts" app/ lib/ | wc -l
# 与上下文包装器数量比较
# 密钥检测
git secrets --scan # 如果安装了git-secrets
grep -rE "sk_|pk_|password=" . --include="*.ts"
预部署安全审查
在任何生产部署前:
- [ ] npm审计显示无高/严重问题
- [ ] RLS策略已验证
- [ ] 无新的直接Prisma调用
- [ ] 环境变量已文档化
- [ ] 迁移前已备份
- [ ] 回滚计划已文档化
安全审计报告模板
## 安全审计报告 - {{TICKET_PREFIX}}-XXX
### 摘要
- **日期**: [日期]
- **审计员**: 安全工程师
- **范围**: [审计内容]
### 发现
| 严重性 | 问题 | 位置 | 状态 |
| -------- | ----- | -------- | ------ |
| 高 | ... | ... | 已修复 |
| 中 | ... | ... | 开放 |
### RLS验证
- [x] 所有表已启用RLS
- [x] 用户隔离已验证
- [x] 管理员策略正确限定范围
### 建议
1. [建议]
2. [建议]
### 批准
- [ ] 安全工程师批准
- [ ] 准备部署
参考
- 安全架构:
docs/guides/SECURITY_FIRST_ARCHITECTURE.md - RLS实现:
docs/database/RLS_IMPLEMENTATION_GUIDE.md - RLS策略:
docs/database/RLS_POLICY_CATALOG.md - OWASP Top 10: https://owasp.org/Top10/