菜单

安全最佳实践

相关源文件

本文档概述了 Node.js 应用程序的关键安全实践,为保护您的应用程序免受常见漏洞和攻击提供了全面指南。它涵盖了输入验证、访问控制、依赖项管理和安全编码模式等基本技术,以保护 Node.js 应用程序。

有关性能相关的安全注意事项,请参阅性能实践。有关生产部署安全,请参阅生产部署实践

目录

安全威胁形势

Node.js 应用程序面临着许多安全威胁,必须通过审慎的安全实践来解决。在 Node.js 上下文中,了解 OWASP Top 10 漏洞尤为重要。

Node.js 应用程序中的常见攻击向量

来源:README.md167-188

输入验证

实施强大的输入验证是防御注入攻击的第一道防线。Node.js 应用程序应在处理所有传入数据之前对其进行验证。

JSON Schema 验证

使用像 ajvzodtypebox 这样的模式验证库,可以为 API 输入定义严格的模式,防止畸形数据和潜在的注入点。

来源:README.md171-172

避免危险模式

几种常见的编码模式会产生安全漏洞

模式风险安全替代方案
使用 eval()执行任意代码使用 JSON.parse() 或专用库
动态 require()加载恶意模块使用具有显式路径的静态导入
不安全的正则表达式ReDoS 攻击使用 safe-regex 或 validator 库
直接 SQL 查询SQL 注入使用带有参数化查询的 ORM/ODM

来源:sections/security/avoideval.md sections/security/regex.md

使用安全的正则表达式防止 ReDoS 攻击

当正则表达式包含容易受到灾难性回溯攻击的模式时,它们会成为安全漏洞

来源:sections/security/regex.md

速率限制和 DoS 防护

速率限制实施

速率限制对于防止 DoS 攻击至关重要。为 Express 应用程序使用像 express-rate-limit 这样的中间件,或者对于通用的 Node.js 应用程序使用更强大的解决方案,例如 rate-limiter-flexible

对于更复杂的场景,可以考虑使用 Redis 进行分布式速率限制

来源:sections/security/limitrequests.md README.md162-164

秘钥管理

从配置中提取秘密信息

绝不应将秘密信息存储在代码库中。而是

  1. 使用环境变量存储秘密信息
  2. 实施专用的秘密管理解决方案
  3. 如果敏感数据必须包含在配置文件中,请对其进行加密

环境变量与配置文件

对于包含秘密信息的应用程序配置

来源:README.md164-165

数据库安全

防止数据库注入攻击需要使用能正确清理输入的 ORM 或查询构建器。

使用 ORM/ODM 防止注入

NoSQL 注入防护

NoSQL 数据库也容易受到注入攻击

来源:README.md168-169

认证与授权

使用 bcrypt/scrypt 存储密码

切勿以明文形式存储密码。使用 bcrypt 或 scrypt 等现代哈希算法

JWT 安全最佳实践

使用 JWT 进行身份验证时

  1. 使用强健的、随机生成的密钥
  2. 设置适当的过期时间
  3. 实施令牌轮换
  4. 支持将受损的令牌加入阻止列表

来源:README.md169-170 README.md172-173

防止暴力破解

对身份验证端点实施防范暴力破解攻击的措施

来源:README.md173-174

HTTP 响应安全

HTTP 安全标头

实施安全的 HTTP 标头以防范常见的 Web 漏洞

防止不安全的重定向

切勿信任用户输入进行重定向

来源:README.md167-168 sections/security/saferedirects.chinese.md

隐藏错误详情

不要向客户端暴露内部错误详情

来源:sections/security/hideerrors.md

依赖管理

自动化漏洞扫描

设置自动化扫描以查找易受攻击的依赖项

在 CI/CD 流水线中实现 npm audit

考虑使用 Snyk 或 Dependabot 等专用安全扫描工具,它们可以提供更全面的分析并自动创建修复的 PR。

来源:README.md168-169

使用 LTS Node.js 版本

在生产环境中始终使用 Node.js 的长期支持 (LTS) 版本。LTS 版本比当前版本能接收到更长时间的安全更新和错误修复。

来源:sections/production/LTSrelease.chinese.md README.md151-152

安全编码实践

以非 root 用户运行 Node.js

在容器化环境中,切勿以 root 用户运行 Node.js 应用程序

安全的子进程处理

生成子进程时,切勿直接使用用户输入

在沙箱中运行不受信任的代码

当你需要执行不受信任的代码时

来源:README.md180-182 README.md178-179

安全监控

使用 APM 产品进行安全监控

应用程序性能监控 (APM) 工具也有助于识别安全问题

Node.js 应用程序安全清单

类别实践实现
代码 Linting使用面向安全的 ESLint 插件eslint-plugin-security
输入验证验证所有输入JSON schema 验证库
身份验证保护密码bcrypt/scrypt
身份验证实施账户锁定对登录端点进行速率限制
秘密将敏感信息与代码隔离开环境变量、Vault
依赖项扫描漏洞npm audit, Snyk, Dependabot
注入防止 SQL 注入使用带有参数化查询的 ORM
设置安全标头helmet 中间件
DoS 防护实施速率限制express-rate-limit
错误处理隐藏错误详情自定义错误处理器
代码执行避免 eval()替代方法
RegEx防止 ReDoSsafe-regex, validator 库

来源:README.md160-188

结论

实施这些安全最佳实践将显著增强 Node.js 应用程序的防护能力。请记住,安全不是一劳永逸的努力,而是一个需要持续警惕、更新和测试的持续过程。

始终遵循纵深防御原则,实施多层安全控制,并及时了解 Node.js 生态系统中新兴的安全威胁和漏洞。