Ubuntu上Node.js安全防護實踐
sudo apt update && sudo apt upgrade,修補操作系統及軟件包漏洞,降低被攻擊風險。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash安裝nvm,避免系統包管理器固定版本的安全滯后問題,支持靈活切換版本。nodeuser)并通過chown -R nodeuser:nodeuser /path/to/app設置目錄權限,降低權限濫用風險。ufw(Ubuntu默認防火墻)僅開放必要端口(如HTTP 80、HTTPS 443),命令示例:sudo ufw allow 443/tcp;若需限制IP訪問,可添加sudo ufw allow from 192.168.1.100 to any port 443,僅允許可信IP連接。sudo apt install certbot python3-certbot-nginx),配置Node.js服務器使用HTTPS,防止中間人攻擊。示例代碼:const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/yourdomain.com/fullchain.pem')
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('Secure connection established\n');
}).listen(443);
```。
express-validator(Express框架)或DOMPurify(前端/后端通用)過濾用戶輸入,防止SQL注入、XSS(跨站腳本)等攻擊。示例(Express):const { body, validationResult } = require('express-validator');
app.post('/submit',
body('username').isLength({ min: 3 }).trim().escape(),
body('email').isEmail().normalizeEmail(),
(req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() });
// 處理合法輸入
}
);
```。
helmet中間件自動配置安全頭,如X-Frame-Options(防點擊劫持)、X-XSS-Protection(啟用瀏覽器XSS過濾器)、Content-Security-Policy(限制資源加載),示例:app.use(helmet())。express-rate-limit限制客戶端請求頻率(如每分鐘60次),防止DDoS攻擊;通過body-parser的limit選項限制請求體大?。ㄈ?00KB),避免大請求耗盡服務器資源。示例:const rateLimit = require('express-rate-limit');
const limiter = rateLimit({ windowMs: 60 * 1000, max: 60 }); // 1分鐘內最多60次請求
app.use(limiter);
const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '100kb' }));
```。
winston),避免泄露敏感信息(如數據庫結構、服務器路徑)。示例:app.use((err, req, res, next) => {
console.error(err.stack); // 記錄到日志
res.status(500).send('Something broke!');
});
```。
npm audit檢查項目依賴中的已知漏洞,npm outdated查看過時依賴,及時更新到安全版本;對于無法修復的漏洞,可使用snyk等工具監控。bcrypt或scrypt對用戶密碼進行哈希處理,避免明文存儲。示例(bcrypt):const bcrypt = require('bcrypt');
const saltRounds = 10;
const plainPassword = 'userPassword123';
bcrypt.hash(plainPassword, saltRounds, (err, hash) => {
if (err) throw err;
// 存儲hash到數據庫
});
// 驗證密碼
bcrypt.compare(plainPassword, hash, (err, result) => {
if (result) console.log('Password matched!');
else console.log('Password did not match!');
});
```。
winston或bunyan等日志庫記錄應用活動(如請求、錯誤、登錄),配置logrotate按日期或大小輪換日志文件(如保留90天、壓縮舊日志),防止日志文件過大占用磁盤空間。示例(winston):const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
new winston.transports.File({ filename: 'logs/combined.log' })
]
});
logger.info('Application started');
```。
pm2(進程管理工具)監控Node.js應用狀態(如CPU、內存使用率),設置告警(如進程崩潰時重啟、內存超過閾值時通知)。示例:pm2 install pm2-logrotate(日志輪換)、pm2 monit(實時監控)。