本文档概述了 Node.js 应用程序的关键安全实践,为保护您的应用程序免受常见漏洞和攻击提供了全面指南。它涵盖了输入验证、访问控制、依赖项管理和安全编码模式等基本技术,以保护 Node.js 应用程序。
有关性能相关的安全注意事项,请参阅性能实践。有关生产部署安全,请参阅生产部署实践。
Node.js 应用程序面临着许多安全威胁,必须通过审慎的安全实践来解决。在 Node.js 上下文中,了解 OWASP Top 10 漏洞尤为重要。
实施强大的输入验证是防御注入攻击的第一道防线。Node.js 应用程序应在处理所有传入数据之前对其进行验证。
使用像 ajv、zod 或 typebox 这样的模式验证库,可以为 API 输入定义严格的模式,防止畸形数据和潜在的注入点。
几种常见的编码模式会产生安全漏洞
| 模式 | 风险 | 安全替代方案 |
|---|---|---|
使用 eval() | 执行任意代码 | 使用 JSON.parse() 或专用库 |
动态 require() | 加载恶意模块 | 使用具有显式路径的静态导入 |
| 不安全的正则表达式 | ReDoS 攻击 | 使用 safe-regex 或 validator 库 |
| 直接 SQL 查询 | SQL 注入 | 使用带有参数化查询的 ORM/ODM |
来源:sections/security/avoideval.md sections/security/regex.md
当正则表达式包含容易受到灾难性回溯攻击的模式时,它们会成为安全漏洞
速率限制对于防止 DoS 攻击至关重要。为 Express 应用程序使用像 express-rate-limit 这样的中间件,或者对于通用的 Node.js 应用程序使用更强大的解决方案,例如 rate-limiter-flexible
对于更复杂的场景,可以考虑使用 Redis 进行分布式速率限制
来源:sections/security/limitrequests.md README.md162-164
绝不应将秘密信息存储在代码库中。而是
对于包含秘密信息的应用程序配置
防止数据库注入攻击需要使用能正确清理输入的 ORM 或查询构建器。
NoSQL 数据库也容易受到注入攻击
切勿以明文形式存储密码。使用 bcrypt 或 scrypt 等现代哈希算法
使用 JWT 进行身份验证时
来源:README.md169-170 README.md172-173
对身份验证端点实施防范暴力破解攻击的措施
实施安全的 HTTP 标头以防范常见的 Web 漏洞
切勿信任用户输入进行重定向
来源:README.md167-168 sections/security/saferedirects.chinese.md
不要向客户端暴露内部错误详情
来源:sections/security/hideerrors.md
设置自动化扫描以查找易受攻击的依赖项
在 CI/CD 流水线中实现 npm audit
考虑使用 Snyk 或 Dependabot 等专用安全扫描工具,它们可以提供更全面的分析并自动创建修复的 PR。
在生产环境中始终使用 Node.js 的长期支持 (LTS) 版本。LTS 版本比当前版本能接收到更长时间的安全更新和错误修复。
来源:sections/production/LTSrelease.chinese.md README.md151-152
在容器化环境中,切勿以 root 用户运行 Node.js 应用程序
生成子进程时,切勿直接使用用户输入
当你需要执行不受信任的代码时
来源:README.md180-182 README.md178-179
应用程序性能监控 (APM) 工具也有助于识别安全问题
| 类别 | 实践 | 实现 |
|---|---|---|
| 代码 Linting | 使用面向安全的 ESLint 插件 | eslint-plugin-security |
| 输入验证 | 验证所有输入 | JSON schema 验证库 |
| 身份验证 | 保护密码 | bcrypt/scrypt |
| 身份验证 | 实施账户锁定 | 对登录端点进行速率限制 |
| 秘密 | 将敏感信息与代码隔离开 | 环境变量、Vault |
| 依赖项 | 扫描漏洞 | npm audit, Snyk, Dependabot |
| 注入 | 防止 SQL 注入 | 使用带有参数化查询的 ORM |
| 头 | 设置安全标头 | helmet 中间件 |
| DoS 防护 | 实施速率限制 | express-rate-limit |
| 错误处理 | 隐藏错误详情 | 自定义错误处理器 |
| 代码执行 | 避免 eval() | 替代方法 |
| RegEx | 防止 ReDoS | safe-regex, validator 库 |
实施这些安全最佳实践将显著增强 Node.js 应用程序的防护能力。请记住,安全不是一劳永逸的努力,而是一个需要持续警惕、更新和测试的持续过程。
始终遵循纵深防御原则,实施多层安全控制,并及时了解 Node.js 生态系统中新兴的安全威胁和漏洞。
刷新此 Wiki
最后索引时间2025年4月17日(c0b71c)