Claude Code 安全概述
Claude Code 可以访问你的代码和数据,安全使用非常重要。
安全无小事
Claude Code 的安全使用关系到你的代码和数据安全。
敏感信息处理
禁止发送的内容
❌ 绝对禁止发送给 Claude Code:
1. 密码和密钥
- 数据库密码
- API 密钥
- SSH 密钥
- JWT Secret
2. 认证 Token
- OAuth Token
- Session Token
- API Token
3. 个人信息
- 身份证号
- 银行卡号
- 手机号
- 家庭住址
4. 商业机密
- 专有算法
- 客户数据
- 内部文档
- 合同协议
安全处理方法
✅ 安全处理方法:
1. 使用占位符
❌: password = "abc123"
✅: password = "YOUR_PASSWORD_HERE"
2. 使用环境变量
❌: const apiKey = "sk-xxx"
✅: const apiKey = process.env.API_KEY
3. 使用 .env 文件
API_KEY=sk-xxx
并确保 .env 在 .gitignore 中
4. 使用通用描述
❌: 帮我修复这个 SQL:"SELECT * FROM users WHERE id=1"
✅: 帮我优化这个查询的性能
代码安全审查
Claude 辅助安全审查
bash
# 安全审查提示词
claude --security-review src/auth/login.ts
# 输出示例
## 安全审查报告
### 🔴 高风险问题
1. SQL 注入 (第 45 行)
```javascript
const query = `SELECT * FROM users WHERE email = '${email}'`;建议使用参数化查询
- 密码明文传输 (第 67 行)
禁止返回密码,即使哈希值javascript
res.send({ password: user.password });
🟡 中风险问题
-
缺少限流 (第 23 行) 建议添加登录限流,防止暴力破解
-
Session 未设置安全标志 (第 89 行) 建议添加安全 cookie 配置
### 安全检查清单
```markdown
## 代码安全检查清单
### 认证授权
□ 使用强密码哈希(bcrypt/argon2)
□ 添加登录限流
□ 使用 HTTPS
□ JWT 设置过期时间
□ 敏感操作需要二次验证
### 数据保护
□ 不在日志中记录敏感信息
□ 敏感数据加密存储
□ API 返回过滤敏感字段
□ 文件上传验证类型和大小
### 输入验证
□ 参数化查询防 SQL 注入
□ XSS 过滤用户输入
□ CSRF Token 验证
□ 文件路径验证防目录遍历
环境变量管理
正确的环境变量使用
bash
# .env 文件(不要提交到 Git)
# .env.example(提交,作为模板)
# .env 内容
DATABASE_URL=postgresql://user:pass@host:5432/db
JWT_SECRET=your-secret-key-here
API_KEY=sk-xxx
REDIS_PASSWORD=xxx
# .env.example 模板
DATABASE_URL=postgresql://user:password@host:5432/db
JWT_SECRET=your-jwt-secret
API_KEY=your-api-key在代码中使用
javascript
// ✅ 正确方式
import dotenv from 'dotenv';
dotenv.config();
const dbUrl = process.env.DATABASE_URL;
const jwtSecret = process.env.JWT_SECRET;
// ✅ 使用环境变量构建配置
const config = {
database: {
url: process.env.DATABASE_URL,
},
jwt: {
secret: process.env.JWT_SECRET,
expiresIn: '7d',
},
};API 安全设计
参数化查询
sql
-- ✅ 使用参数化查询
SELECT * FROM users WHERE email = $1 AND password_hash = $2
-- ❌ 禁止字符串拼接
SELECT * FROM users WHERE email = '" + email + "'javascript
// ✅ Node.js + PostgreSQL
const result = await db.query(
'SELECT * FROM users WHERE email = $1 AND password_hash = $2',
[email, passwordHash]
);
// ✅ Node.js + MongoDB
const user = await User.findOne({
email: email,
password: passwordHash,
});
// ❌ 禁止字符串拼接
const query = `SELECT * FROM users WHERE email = '${email}'`;输入验证
javascript
// ✅ 使用 Joi/Zod 进行输入验证
import Joi from 'joi';
const userSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(8).required(),
age: Joi.number().integer().min(0).max(150).optional(),
});
// 验证
const { error, value } = userSchema.validate(req.body);
if (error) {
return res.status(400).json({ error: error.message });
}速率限制
javascript
// ✅ 使用 express-rate-limit
import rateLimit from 'express-rate-limit';
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分钟
max: 100, // 限制 100 次请求
message: '请求过于频繁,请稍后再试',
});
// 应用到 API 路由
app.use('/api', apiLimiter);
// 登录接口更严格的限制
const loginLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
max: 5, // 15 分钟只能尝试 5 次
message: '登录尝试次数过多,请 15 分钟后再试',
});
app.post('/api/login', loginLimiter, authController.login);文件上传安全
安全处理文件上传
javascript
// ✅ 使用 multer + 文件验证
import multer from 'multer';
import path from 'path';
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'uploads/');
},
filename: (req, file, cb) => {
// 使用随机文件名
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, uniqueSuffix + path.extname(file.originalname));
},
});
const fileFilter = (req, file, cb) => {
// 验证文件类型
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (allowedTypes.includes(file.mimetype)) {
cb(null, true);
} else {
cb(new Error('不支持的文件类型'), false);
}
};
const upload = multer({
storage,
fileFilter,
limits: {
fileSize: 5 * 1024 * 1024, // 5MB
},
});安全响应头
正确的安全头
javascript
// ✅ 使用 helmet 设置安全头
import helmet from 'helmet';
app.use(helmet());
// 自定义配置
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "'unsafe-inline'"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:", "https:"],
},
}));
// CORS 配置
app.use(cors({
origin: process.env.ALLOWED_ORIGINS?.split(','),
credentials: true,
}));安全 Cookie 设置
javascript
// ✅ 安全 Cookie 设置
app.use(session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: true, // HTTPS
httpOnly: true, // 防止 XSS
sameSite: 'strict', // CSRF 防护
maxAge: 24 * 60 * 60 * 1000, // 24 小时
},
}));安全是习惯
安全不是一次性的工作,而是贯穿开发全过程的习惯。
总结
Claude Code 安全使用要点:
- 保护敏感信息:禁止发送密码、密钥、个人信息
- 使用环境变量:敏感配置通过环境变量管理
- 代码安全审查:用 Claude 辅助发现安全问题
- 参数化查询:防止 SQL 注入
- 输入验证:验证所有用户输入
- 速率限制:防止暴力破解
- 安全响应头:使用 helmet 设置安全头
记住:安全无小事,防范于未然。