Debian服务器上Node.js与前端JS的安全防护实践
一 系统与环境加固
- 保持系统与软件为最新:执行sudo apt update && sudo apt upgrade -y;建议启用自动安全更新(如unattended-upgrades)以持续获取补丁。
- 以非特权用户运行:创建专用用户(如nodeapp),通过sudo -u nodeapp或进程管理器(如PM2)启动应用,避免以root直接运行。
- 安装与版本管理:优先使用NodeSource仓库或NVM安装并管理Node.js LTS,便于及时升级与安全维护。
- 防火墙最小化开放:使用ufw仅开放必要端口(如22/SSH、80/HTTP、443/HTTPS),生产环境不建议直曝应用端口。
- 进程管理:使用PM2守护进程、设置开机自启与日志轮转,确保崩溃自恢复与可运维性。
二 传输与应用层安全配置
- 全站HTTPS:使用Let’s Encrypt与certbot获取免费证书,配置Nginx反向代理或Node.js内置HTTPS,并强制HTTP跳转HTTPS。
- 安全HTTP头:使用Helmet启用关键安全头(如X-Frame-Options、X-XSS-Protection、Strict-Transport-Security),并按需配置**CSP(内容安全策略)**限制脚本来源。
- 输入验证与输出编码:对所有用户输入进行严格校验(如express-validator),输出到页面时进行转义/编码,杜绝XSS与SQL注入等风险。
- 速率限制与防滥用:对接口实施限流(如按IP/路径/用户),缓解暴力破解、爬虫与DDoS等。
- CORS精细化:仅允许受信任源、方法与头部,避免**cors()**无限制放行。
- 安全Cookie:设置Secure(仅HTTPS传输)与HttpOnly(禁止JS访问),必要时启用SameSite属性。
三 依赖与代码安全
- 依赖漏洞扫描与修复:定期执行npm audit / npm audit fix,结合Snyk进行深度扫描与持续监控,及时升级有漏洞的组件。
- 锁定依赖版本:提交并严格使用package-lock.json / yarn.lock,部署时使用npm ci安装精确版本,避免“漂移”引入风险。
- 移除无用依赖与模块:减少攻击面,仅保留业务必需模块。
- 安全编码:避免使用eval()、new Function()等可执行字符串代码的函数;不直接拼接SQL,优先使用ORM/预编译语句;将密钥/证书等敏感信息放入环境变量(如dotenv),禁止硬编码。
四 前端JS与浏览器侧防护
- 启用CSP:通过Helmet或Nginx下发策略(如default-src ‘self’; script-src ‘self’ https://trusted.cdn.com),显著降低XSS与数据注入风险。
- 限制错误信息公开:生产环境关闭堆栈与详细错误展示,仅记录到服务端日志,防止泄露目录结构、依赖版本等敏感信息。
- 浏览器错误与性能监控:接入Sentry / LogRocket等前端监控,及时捕获JS异常、资源加载失败与可疑行为。
- 安全日志与告警:定期审查前端错误日志与访问日志,对大量404、异常POST、可疑UA等模式设置告警。
五 网络与运行时防护
- 边界与主机加固:仅开放22/80/443等必要端口;必要时在Nginx侧部署WAF(如ModSecurity)或采用云WAF,过滤SQLi、XSS、CSRF等常见攻击。
- 强制访问控制:启用AppArmor(或SELinux)为Node.js进程设定文件系统与网络访问白名单,降低被攻陷后的横向移动风险。
- 入侵检测与防护:部署Fail2ban对SSH/管理接口进行暴力破解封禁;结合Logwatch进行日志汇总与异常巡检。
- 日志与审计:使用Winston/Pino记录访问与错误日志,配置logrotate按日轮转与压缩;必要时接入ELK/Splunk进行集中分析与告警。