Linux 环境下提升 Node.js 配置安全性的关键措施
避免直接以 root 用户启动 Node.js 应用(root 拥有系统最高权限,一旦应用被攻破会导致整个系统沦陷)。应创建专用低权限用户(如 nodeuser),并通过 chown 将应用目录及文件的所有权赋予该用户,最后使用 sudo -u nodeuser node app.js 或进程管理工具(如 pm2)以该用户身份运行应用。
n(sudo npm install -g n)或 nvm(nvm install latest)升级到最新稳定版,及时修复已知安全漏洞。npm audit 扫描项目依赖中的已知漏洞,使用 npm audit fix 自动修复可修复的漏洞;在 package.json 中锁定依赖版本(如 "express": "^4.18.2"),避免意外升级引入风险;定期检查 npm outdated 列出过时的包并更新。通过 helmet 中间件自动设置安全 HTTP 头,防范常见 Web 攻击:
X-XSS-Protection:启用浏览器 XSS 过滤器;X-Content-Type-Options:防止 MIME 类型嗅探;Strict-Transport-Security(HSTS):强制浏览器使用 HTTPS;X-Frame-Options:防止点击劫持。const helmet = require('helmet');
app.use(helmet());
helmet 会根据安全最佳实践调整头部,无需手动逐个设置。
sudo apt install certbot python3-certbot-nginx # Ubuntu/Debian
sudo certbot --nginx -d yourdomain.com # 自动配置 Nginx
res.cookie() 方法将 Cookie 标记为 secure(仅通过 HTTPS 传输)和 httpOnly(禁止 JavaScript 访问),防止 Cookie 泄露。res.cookie('sessionId', 'abc123', { secure: true, httpOnly: true });
express-validator(Express 中间件)或 Joi(schema 验证)对用户输入(如表单、URL 参数、请求体)进行格式检查。示例(express-validator):const { body, validationResult } = require('express-validator');
app.post('/register',
body('username').isLength({ min: 3 }).trim().escape(), // 长度≥3,去除首尾空格,转义 HTML
body('email').isEmail().normalizeEmail(), // 验证邮箱格式
body('password').isLength({ min: 6 }).matches(/\d/), // 至少6位,包含数字
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });
// 处理合法请求
}
);
DOMPurify 清理用户提交的 HTML(防止 XSS),避免直接将用户输入插入数据库(如使用参数化查询或 ORM)。express-session 结合 crypto 库对会话数据进行签名(防止篡改),或将会话存储在 Redis 等外部存储中(避免服务器重启丢失)。示例:const session = require('express-session');
app.use(session({
secret: process.env.SESSION_SECRET || 'your-secret-key', // 从环境变量读取密钥
resave: false, // 仅在修改时保存
saveUninitialized: false, // 不保存未初始化的会话
cookie: { secure: true, httpOnly: true, maxAge: 3600000 } // 1小时过期
}));
sudo ufw allow 22/tcp # 允许 SSH
sudo ufw allow 80/tcp # 允许 HTTP
sudo ufw allow 443/tcp # 允许 HTTPS
sudo ufw enable # 启用防火墙
/etc/ssh/sshd_config 中的 PermitRootLogin no),使用密钥认证替代密码认证,更改 SSH 默认端口(如 2222)。morgan(HTTP 请求日志)或 winston(结构化日志)记录请求详情(如 IP、方法、路径、状态码),避免记录敏感信息(如密码、银行卡号)。示例(morgan):const morgan = require('morgan');
app.use(morgan('combined')); // 记录标准 Apache 格式日志
Sentry(错误监控)、Prometheus(性能指标)、New Relic(全栈监控)实时跟踪应用状态,设置异常告警(如错误率骤升、请求量激增),及时响应安全事件。使用 rate-limiter-flexible 库限制同一 IP 地址在单位时间内的请求数量,防范 DDoS 或暴力破解攻击(如频繁尝试登录)。示例:
const { RateLimiterMemory } = require('rate-limiter-flexible');
const rateLimiter = new RateLimiterMemory({
points: 10, // 每个 IP 允许的最大请求数
duration: 1 // 时间窗口(秒)
});
const rateLimiterMiddleware = (req, res, next) => {
rateLimiter.consume(req.ip)
.then(() => next())
.catch(() => res.status(429).send('Too Many Requests')); // 超过限制返回 429
};
app.use(rateLimiterMiddleware); // 全局应用或针对登录接口
eval():eval() 会执行任意字符串代码,易被注入恶意脚本,应使用 JSON.parse() 替代 JSON 解析。'use strict' 模式,避免意外创建全局变量(导致变量污染)。express、lodash),避免使用无人维护或存在已知漏洞的库。