提升 Node.js 服务器的安全性需要从 代码、运行环境、网络通信、依赖管理、部署架构 等多个层面入手。下面是一份较系统、实战性较强的安全提升指南,按优先级和常见场景整理。
node -v
✅ 建议:
# 错误示例
sudo node app.js
✅ 正确做法:
USER node
使用 pm2 或 systemd:
pm2 start app.js
const https = require('https');
const fs = require('fs');
https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}, app).listen(443);
✅ 推荐:
使用 helmet 中间件:
npm i helmet
const helmet = require('helmet');
app.use(helmet());
防止:
csrf 模块)// ❌ 危险
User.find({ name: req.body.name });
// ✅ 安全
User.find({ name: { $eq: req.body.name } });
使用 Joi / Zod / express-validator
npm i zod
const { z } = require('zod');
const schema = z.object({
email: z.string().email(),
age: z.number().min(1)
});
✅ 拒绝一切未校验的数据
使用 express-rate-limit
npm i express-rate-limit
const rateLimit = require('express-rate-limit');
app.use(rateLimit({
windowMs: 15 * 60 * 1000,
max: 100
}));
app.use(express.json({ limit: '100kb' }));
防止:
✅ 推荐方案:
❌ 避免:
npm i bcrypt
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);
✅ 规则:
npm audit
npm audit fix
✅ 进阶:
snykpackage-lock.json
npm installnpm ci❌ 慎用:
evalFunctionvm(除非非常清楚风险)DATABASE_URL=xxx
JWT_SECRET=xxx
process.env.JWT_SECRET
✅ 工具:
❌ 不要:
.env 到 GitFROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
USER node
CMD ["node", "server.js"]
✅ 建议:
推荐架构:
用户 → Nginx → Node.js
Nginx 负责:
✅ Node LTS
✅ 非 root 运行
✅ HTTPS
✅ Helmet
✅ 输入校验
✅ 限流
✅ 密码加密
✅ 依赖扫描
✅ 环境变量
✅ 反向代理
如果你愿意,我可以:
你可以直接贴出你的技术栈或场景。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。