一、技能概述
该技能适用于以下场景:实现认证或授权、处理用户输入或文件上传、创建新的 API 端点、使用密钥或凭证、实现支付功能、存储或传输敏感数据、集成第三方 API。它提供了一套系统化的安全审查框架,覆盖从代码编写到生产部署的完整安全生命周期。
核心原则:安全不是可选项——任何一个漏洞都可能危及整个平台。当有疑问时,宁可选择保守的方案。
二、核心功能
1. 密钥管理(Secret Management)
| 错误做法 ❌ | 正确做法 ✅ |
|---|---|
const apiKey = "sk-proj-xxxxx" |
const apiKey = process.env.OPENAI_API_KEY |
const dbPassword = "password123" |
const dbUrl = process.env.DATABASE_URL |
验证检查:
-
无硬编码的 API 密钥、token 或密码
-
所有密钥存储在环境变量中
-
.env.local在.gitignore中 -
密钥不在 git 历史中
-
生产密钥托管在 Vercel、Railway 等平台
2. 输入验证(Input Validation)
-
使用 Zod 等库定义验证 Schema
-
验证文件上传的大小、MIME 类型和扩展名
-
使用白名单验证(而非黑名单)
-
错误消息不泄露敏感信息
import { z } from 'zod'
const CreateUserSchema = z.object({
email: z.string().email(),
name: z.string().min(1).max(100),
age: z.number().int().min(0).max(150)
})
3. SQL 注入防护(SQL Injection Prevention)
-
绝不拼接 SQL 字符串
-
始终使用参数化查询或 ORM/Query Builder
-
在 Supabase 中使用
.eq()等方法自动处理
// ❌ 危险
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
// ✅ 安全
await db.query('SELECT * FROM users WHERE email = $1', [userEmail])
4. 认证与授权(Authentication & Authorization)
| 错误做法 ❌ | 正确做法 ✅ |
|---|---|
| JWT 存储在 localStorage(易受 XSS 攻击) | JWT 存储在 HttpOnly、Secure、SameSite=Strict 的 Cookie 中 |
验证检查:
-
执行敏感操作前先验证授权
-
Supabase 中启用 Row Level Security(RLS)
-
实现基于角色的访问控制
5. XSS 防护(XSS Prevention)
-
使用 DOMPurify 等库净化用户提供的 HTML
-
配置 Content Security Policy(CSP)
-
React 等框架的默认 XSS 保护利用好
import DOMPurify from 'isomorphic-dompurify'
const clean = DOMPurify.sanitize(html, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
ALLOWED_ATTR: []
})
6. CSRF 防护(CSRF Protection)
-
在状态变更操作中使用 CSRF Token
-
所有 Cookie 设置
SameSite=Strict -
实现双重提交 Cookie 模式
7. 速率限制(Rate Limiting)
-
所有 API 端点启用速率限制
-
对搜索等昂贵操作使用更严格的限制
-
支持基于 IP 和基于用户(已认证)的限流
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分钟
max: 100, // 每窗口 100 次请求
message: 'Too many requests'
})
8. 敏感数据暴露防护(Sensitive Data Exposure)
-
绝不在日志中记录密码、token 或完整支付卡数据
-
用户端只返回通用错误消息,详细错误仅记录在服务器日志
-
不向用户暴露 stack trace
// ❌ 错误:记录敏感数据
console.log('User login:', { email, password })
// ✅ 正确:脱敏
console.log('User login:', { email, userId })
9. 区块链安全(Blockchain Security - Solana)
-
验证钱包签名
-
验证交易详情(接收方、金额)
-
交易前检查余额
-
不盲目签名交易
10. 依赖安全(Dependency Security)
-
定期运行
npm audit -
提交 lock 文件
-
CI/CD 中使用
npm ci -
启用 GitHub Dependabot
-
定期安全更新
三、主要用途
-
代码审查与安全审计 —— 在审查代码时对照完整清单检查常见安全漏洞
-
新功能开发安全指导 —— 在添加认证、API 端点、支付功能时提供安全模式参考
-
生产部署前安全检查 —— 部署前逐项确认所有安全措施已到位
-
团队安全培训 —— 作为开发团队的安全编码规范参考文档
-
漏洞修复参考 —— 发现安全问题时快速定位对应的防护措施
四、部署前检查清单
在生产部署前,必须逐项确认:
-
无硬编码密钥,全部使用环境变量
-
所有用户输入已验证
-
所有数据库查询使用参数化
-
用户内容已进行 XSS 净化
-
CSRF 防护已启用
-
Token 处理正确(HttpOnly Cookie)
-
角色验证已就位
-
所有端点启用速率限制
-
生产环境强制 HTTPS
-
安全标头已配置(CSP、X-Frame-Options)
-
错误消息不泄露敏感数据
-
日志不记录敏感数据
-
依赖已更新、无已知漏洞
-
Supabase RLS 已启用
-
CORS 配置正确
-
文件上传已验证(大小、类型)
-
钱包签名已验证(如适用)
五、重要原则
-
绝不硬编码密钥 —— 所有密钥使用环境变量
-
始终验证输入 —— 使用 Schema 验证,使用白名单而非黑名单
-
始终使用参数化查询 —— 绝不拼接 SQL 字符串
-
Token 存储在 HttpOnly Cookie —— 绝不使用 localStorage
-
执行操作前先授权 —— 始终先验证用户权限
-
净化用户提供的 HTML —— 使用 DOMPurify 等库
-
启用速率限制 —— 所有 API 端点都需要
-
日志脱敏 —— 绝不记录密码、token 或 PII
-
启用 RLS —— 在 Supabase 中为所有表启用行级安全
-
定期更新依赖 —— 运行
npm audit并修复漏洞
六、总结
Security Review 是一套完整的安全审查与代码审计技能,覆盖密钥管理、输入验证、SQL 注入防护、认证授权、XSS 防御、CSRF 防护、速率限制、敏感数据保护、区块链安全、依赖安全等 10 个核心安全领域。它提供了清晰的“错误 vs 正确”对比示例和逐项验证检查清单,适用于代码审查、新功能开发、生产部署前检查、团队安全培训和漏洞修复等场景。该技能源自 ECC 项目,强调“安全不是可选项——任何一个漏洞都可能危及整个平台”。