零度AI
高级12 分钟阅读

Claude Code 安全最佳实践

使用 Claude Code 时的安全注意事项,防止数据泄露和误用

Claude Code安全最佳实践数据保护

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}'`;

建议使用参数化查询

  1. 密码明文传输 (第 67 行)
    javascript
    res.send({ password: user.password });
    禁止返回密码,即使哈希值

🟡 中风险问题

  1. 缺少限流 (第 23 行) 建议添加登录限流,防止暴力破解

  2. 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,
}));
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 安全使用要点:

  1. 保护敏感信息:禁止发送密码、密钥、个人信息
  2. 使用环境变量:敏感配置通过环境变量管理
  3. 代码安全审查:用 Claude 辅助发现安全问题
  4. 参数化查询:防止 SQL 注入
  5. 输入验证:验证所有用户输入
  6. 速率限制:防止暴力破解
  7. 安全响应头:使用 helmet 设置安全头

记住:安全无小事,防范于未然