1. 系统与软件包更新
保持Ubuntu系统和所有软件包(包括Node.js、npm)为最新版本,及时修补已知安全漏洞。使用以下命令更新系统:
sudo apt update && sudo apt upgrade -y
建议安装unattended-upgrades包实现自动更新,通过编辑/etc/apt/apt.conf.d/50unattended-upgrades文件配置更新策略。
2. Node.js版本管理
使用**Node Version Manager (nvm)**安装和管理Node.js版本,避免使用系统包管理器安装的固定版本(可能停止安全更新)。安装nvm后,切换至最新稳定版本:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
source ~/.bashrc
nvm install node
nvm use node
定期通过nvm ls-remote检查可用版本,升级至最新稳定版。
3. 权限与用户管理
sudo -u <username>切换用户,降低安全漏洞的潜在损害。4. 依赖安全管理
npm audit命令检查项目依赖项中的已知漏洞,运行npm audit fix自动修复可修复的漏洞;或使用Snyk等第三方工具进行更深入的依赖分析。package.json中指定依赖的固定版本(如"express": "4.18.2"),并使用package-lock.json(或yarn.lock)锁定依赖树,避免意外升级引入风险。5. 输入验证与过滤
对用户输入(如表单数据、URL参数、HTTP请求体)进行严格验证和清理,防止XSS(跨站脚本)、SQL注入等攻击。推荐使用以下库:
express-validator:用于Express应用的输入验证(如长度、格式检查);DOMPurify:用于清理HTML内容,防止XSS攻击。express-validator):const { check, validationResult } = require('express-validator');
app.post('/submit', [
check('username').isLength({ min: 3 }).withMessage('用户名至少3个字符'),
check('email').isEmail().withMessage('请输入有效邮箱')
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// 处理合法输入
});
```。
**6. 安全配置与HTTP头部**
- **使用Helmet中间件**:通过`helmet`库设置安全的HTTP头部(如`Content-Security-Policy`、`X-Frame-Options`、`X-XSS-Protection`),减少XSS、点击劫持等攻击风险。示例代码:
```javascript
const helmet = require('helmet');
app.use(helmet());
helmet.contentSecurityPolicy()限制浏览器加载的资源(如脚本、样式),仅允许信任的域名执行脚本,有效防御XSS攻击。7. 加密与传输安全
https模块:const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/path/to/private.key'),
cert: fs.readFileSync('/path/to/certificate.crt')
};
https.createServer(options, app).listen(443);
bcrypt或scrypt等库对用户密码进行哈希处理,避免明文存储。示例代码(使用bcrypt):const bcrypt = require('bcrypt');
const saltRounds = 10;
bcrypt.hash('userPassword', saltRounds, (err, hash) => {
// 存储hash到数据库
});
```。
8. 日志与监控
winston、bunyan等库记录应用日志(如请求、错误),避免在生产环境中暴露敏感信息(如密码、数据库凭证)。示例代码(使用bunyan):const bunyan = require('bunyan');
const log = bunyan.createLogger({ name: 'myApp', level: 'info' });
log.info('Application started');
9. 网络安全防护
ufw(Uncomplicated Firewall)限制对服务器的访问,仅开放必要端口(如SSH的22端口、HTTP的80端口、HTTPS的443端口):sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
/etc/ssh/sshd_config中设置PermitRootLogin no),启用密钥认证(禁用密码认证),设置空闲超时退出(ClientAliveInterval 300)。10. 其他最佳实践
eval():eval()函数会执行任意代码,易导致代码注入攻击,应使用安全的替代方案(如JSON.parse())。express-rate-limit中间件限制客户端请求频率(如每分钟最多60次),防止DoS(拒绝服务)攻击。示例代码:const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 60 * 1000, // 1分钟
max: 60 // 限制每个IP每分钟60次请求
});
app.use(limiter);
cors中间件限制允许访问API的域名(如仅允许https://example.com),避免跨域攻击。