代码安全的重要性
编写安全的代码是每个开发者的责任。Claude Code 可以帮助你:
- 识别潜在的安全隐患
- 实施安全最佳实践
- 代码安全审查
- 修复安全漏洞
安全无小事
一个安全漏洞可能会导致严重后果,从数据泄露到系统崩溃。永远不要忽略安全问题!
常见安全问题
1. SQL 注入
javascript
// ❌ 不安全的代码
app.get('/users', (req, res) => {
const { id } = req.query
const sql = `SELECT * FROM users WHERE id = ${id}` // 危险!
db.query(sql, (err, results) => {
res.json(results)
})
})
// ✅ 安全的代码
app.get('/users', (req, res) => {
const { id } = req.query
const sql = 'SELECT * FROM users WHERE id = ?' // 使用占位符
db.query(sql, [id], (err, results) => {
res.json(results)
})
})2. XSS 攻击
javascript
// ❌ 不安全的代码
function renderUserComment(comment) {
return `<div>${comment}</div>` // 直接渲染,危险!
}
// ✅ 安全的代码
function escapeHtml(text) {
const map = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}
return text.replace(/[&<>"]/g, m => map[m])
}
function renderUserComment(comment) {
return `<div>${escapeHtml(comment)}</div>`
}3. 跨站请求伪造 (CSRF)
javascript
// ❌ 不安全的表单
<form action="/change-password" method="POST">
<input type="password" name="newPassword">
<button type="submit">修改密码</button>
</form>
// ✅ 安全的表单 - 添加 CSRF 令牌
<form action="/change-password" method="POST">
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
<input type="password" name="newPassword">
<button type="submit">修改密码</button>
</form>安全最佳实践
1. 输入验证
javascript
function validateEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
return emailRegex.test(email)
}
function validatePassword(password) {
// 密码至少 8 个字符,包含字母和数字
return password.length >= 8 && /[a-zA-Z]/.test(password) && /[0-9]/.test(password)
}2. 密码安全
javascript
// 使用 bcrypt 哈希密码
import bcrypt from 'bcryptjs'
async function hashPassword(password) {
const saltRounds = 10
return bcrypt.hash(password, saltRounds)
}
async function comparePassword(password, hashedPassword) {
return bcrypt.compare(password, hashedPassword)
}3. 身份验证
javascript
// 使用 JWT 进行身份验证
import jwt from 'jsonwebtoken'
function generateToken(user) {
const payload = {
id: user.id,
email: user.email,
role: user.role
}
return jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: '1h' })
}
function verifyToken(token) {
try {
return jwt.verify(token, process.env.JWT_SECRET)
} catch (error) {
return null
}
}安全代码审查
1. 使用 ESLint 规则
javascript
// .eslintrc.js
module.exports = {
env: {
browser: true,
node: true
},
extends: ['eslint:recommended'],
rules: {
// 防止使用 eval
'no-eval': 'error',
// 防止使用 alert、confirm、prompt
'no-alert': 'warn',
// 防止使用 with 语句
'no-with': 'error',
// 防止使用 delete
'no-delete-var': 'error'
}
}2. 安全扫描工具
bash
# 使用 eslint-plugin-security
npm install eslint-plugin-security --save-dev
# 使用 npm audit
npm audit
# 使用 Snyk 进行安全扫描
npm install -g snyk
snyk test服务器安全
1. 环境变量
javascript
// 错误的做法
const DB_PASSWORD = 'password123'
// 正确的做法
const DB_PASSWORD = process.env.DB_PASSWORD2. CORS 配置
javascript
import cors from 'cors'
const allowedOrigins = ['https://example.com', 'http://localhost:3000']
const corsOptions = {
origin: (origin, callback) => {
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true)
} else {
callback(new Error('Not allowed by CORS'))
}
},
credentials: true
}
app.use(cors(corsOptions))3. 日志和监控
javascript
import winston from 'winston'
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
})
// 记录错误
app.use((err, req, res, next) => {
logger.error(err.stack)
res.status(500).json({ error: '服务器内部错误' })
})实战案例:安全审计
运行安全扫描
bash
# 运行 npm audit 检查依赖
npm audit
# 使用 eslint 检查代码
npm run lint
# 使用安全扫描工具
npm install -g eslint-plugin-security
eslint --plugin security .修复发现的问题
javascript
// 修复代码中的安全问题
// 1. 替换 eval 为安全的方法
// 2. 修复 SQL 注入漏洞
// 3. 改进密码存储验证修复
bash
# 再次运行安全扫描
npm audit fix
npm run lint常见安全检查清单
代码审计
- ✅ 检查是否有硬编码的敏感信息
- ✅ 验证输入是否被正确验证
- ✅ 检查密码是否正确存储
- ✅ 验证是否防止了常见攻击
依赖审计
- ✅ 检查是否有已知漏洞的依赖
- ✅ 使用 npm audit 定期检查
- ✅ 及时更新有安全问题的依赖
配置审计
- ✅ 检查日志配置是否正确
- ✅ 验证环境变量是否安全存储
- ✅ 检查 CORS 和安全策略
下一步
掌握了安全最佳实践后,接下来可以学习:
- Claude Code DevOps - 运维安全
- Claude Code 架构安全 - 系统架构安全
- Claude Code 威胁建模 - 风险评估
安全高于一切
记住,安全是一个持续的过程,不是一次性任务。Claude Code 可以帮助你建立良好的安全习惯!