跳到主要内容

博客

保护 Node.js 和 MySQL 项目中的 API:最佳实践和代码示例

Node.js 和 MySQL 中 API 安全性的最佳实践

  • 阅读约 1 分钟
  • Updated

保护 Node.js 和 MySQL 项目中的 API

API 安全层客户端浏览器/应用程序TLSHTTPS1.3🔒速率限制器DDoS保护🛡️授权JWT验证RBAC🔑输入验证清理Joi/Zod✅SQL参数已准备声明🗃️MySQL数据库深度防御:每一层都可防止一类攻击单层是不够的 — 安全需要所有层协同工作第 1 层第 2 层第 3 层第 4 层第 5 层加密所有流量阻止暴力破解强制攻击验证身份防止XSS/注入防止SQL 注入
API Security Diagram

API 是现代网络和移动应用程序的支柱。当使用 Node.js 和 MySQL 构建 API 时,安全性必须是重中之重。本指南涵盖了基本的最佳实践和代码示例,可帮助您保护 API。

API 安全架构

API Security Architecture

该图显示了 API 安全性的分层方法,包括网关、WAF、身份验证和数据库保护。

API 网关 & WAF

API Gateway and WAF

使用 API 网关和 Web 应用程序防火墙 (WAF) 来集中安全、速率限制和请求验证。这有助于在恶意流量到达您的 Node.js 应用程序之前对其进行阻止。

用户到数据库流程

User to DB Flow

该图显示了从用户到数据库的安全流程,以及每个步骤的身份验证和授权检查。

1. 到处使用 HTTPS

始终通过 HTTPS 为您的 API 提供服务,以加密传输中的数据。使用letsencrypt或商业SSL证书。

2. 身份验证和授权

  • JWT(JSON Web 令牌):使用 JWT 进行无状态身份验证。在登录时发出令牌并在每个请求时验证它们。
  • 基于角色的访问控制 (RBAC):根据用户角色限制对敏感端点的访问。
// Example: JWT middleware
const jwt = require('jsonwebtoken');
function authenticateToken(req, res, next) {
  const token = req.headers['authorization']?.split(' ')[1];
  if (!token) return res.sendStatus(401);
  jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

3. 防止 SQL 注入

OWASP 主要威胁和威胁防御SQL 注入恶意查询参数化查询准备好的语句和语句ORM身份验证被破坏凭证薄弱JWT + MFA + bcrypt令牌轮换和加密散列XSS脚本注入输入清理CSP 标头和转义SSRF内部访问URL 允许列表网络分段配置错误默认设置安全强化Helmet.js &审计每个威胁都有防御 — 实施所有层以实现全面保护基于 OWASP 十大 Web 应用程序安全风险

始终使用参数化查询或 ORM 库(如 Sequelize 或 Knex)来防止 SQL 注入。

// Using mysql2 with placeholders
const [rows] = await db.execute('SELECT * FROM users WHERE id = ?', [userId]);

4. 输入验证和清理

使用express-validator或joi等库验证和清理所有传入数据。

5. 保护敏感数据

  • 切勿存储纯文本密码。始终使用bcrypt进行哈希处理。
  • 将机密(数据库凭据、JWT 机密)存储在环境变量中,而不是代码中。

6. 速率限制和节流

使用express-rate-limit等速率限制中间件来保护您的 API 免受暴力破解和 DDoS 攻击。

7. 记录和监控

记录所有身份验证尝试和错误。使用监控工具来检测可疑活动。

8. 保持依赖关系更新

定期更新 Node.js、MySQL 和所有依赖项以修补已知漏洞。

进一步阅读

Related reading. For an explainable edge Web Application Firewall on TenthMatrix WSL Proxy, see the WAF blog, the technical article, or wslproxy.org.