Node.js 的 5 个常见服务器漏洞

news2025/6/22 4:48:04

Node.js 是一个强大且广泛使用的 JavaScript 运行时环境,用于构建服务器端应用程序。然而,与任何其他软件一样,Node.js 也有自己的一些漏洞,如果处理不当,可能会导致安全问题。请注意,这些漏洞并不是 Node.js 所独有的,它们可以在每种后端编程语言中找到。

在本文中,我们将讨论一些常见的 Node.js 服务器漏洞,并提供一些有关如何缓解这些漏洞的技巧。

SQL 注入漏洞

Node.js 应用程序容易遭受注入攻击,比如 SQL 注入、NoSQL 注入和命令注入。当攻击者将恶意代码输入到易受攻击的应用程序并且该应用程序执行该代码时,就会发生此类攻击。

当不受信任的数据连接到 SQL 查询中时,注入漏洞可能是 SQL 注入。攻击者可以将恶意代码注入查询中,然后数据库可以执行该查询。

以下代码容易受到 SQL 注入:

const express = require("express");
const app = express();
const mysql = require("mysql");

const connection = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
  database: "test",
});

app.get("/user", (req, res) => {
  const id = req.query.id;
  const query = `SELECT * FROM users WHERE id = ${id}`;
  connection.query(query, (error, results) => {
    if (error) {
      throw error;
    }
    res.send(results);
  });
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

在上面的示例中,查询字符串中的 id 参数直接连接到 SQL 查询中。如果攻击者传递 id 的恶意值,例如 1 OR 1=1,则生成的查询将是 SELECT * FROM users WHERE id = 1 OR 1=1,这将返回 users 表。

为了防止此类漏洞,在使用数据库时验证用户输入并使用参数化查询非常重要。在上面的示例中,这可以通过使用准备好的语句并将 id 值绑定到查询来完成,如下所示:

app.get("/user", (req, res) => {
  const id = req.query.id;
  const query = "SELECT * FROM users WHERE id = ?";
  connection.query(query, [id], (error, results) => {
    if (error) {
      throw error;
    }
    res.send(results);
  });
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

跨站脚本(XSS)漏洞

XSS 攻击允许攻击者将恶意脚本注入其他用户查看的网页中。这可能会导致敏感信息被盗,例如登录凭据或其他敏感数据。为了防止 XSS 攻击,在将其发送到客户端之前清理所有用户生成的数据并对其进行验证非常重要。

以下是易受 XSS 攻击的易受攻击的代码示例:

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  const name = req.query.name;
  res.send(`<h1>Hello, ${name}</h1>`);
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

查询字符串中的 name 参数直接包含在 HTML 响应中。如果攻击者传递 name 的恶意值(例如 <script>alert('XSS')</script>),则生成的 HTML 将包含攻击者的恶意脚本。

如果你想尝试一下,请创建一个名为 xss 的文件夹。移至该文件夹并键入 npm init -y,然后键入 npm i express。创建一个名为 index.js 的文件并粘贴上面的代码。运行文件 (node index.js) 后,导航到浏览器并访问 localhost:3000。要查看 XSS 攻击的实际情况,只需将你想要的代码添加到查询中,如下所示:

localhost:3000/?name=<script>alert('XSS')</script>

为了防止这种类型的漏洞,我们可以使用诸如 escape-html 之类的库。

const express = require("express");
const app = express();
const escapeHtml = require("escape-html");

app.get("/", (req, res) => {
  const name = escapeHtml(req.query.name);
  res.send(`<h1>Hello, ${name}</h1>`);
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

如果再次测试查询,你将看到不同的结果。

拒绝服务 (DoS) 漏洞

DoS 攻击旨在使服务器过载并导致其崩溃。这可以通过多种方法来完成,例如向服务器发送大量请求或用数据淹没服务器。为了防止 DoS 攻击,实施速率限制、使用适当的错误处理并拥有强大的基础设施非常重要。

以下是一些容易受到 DoS 攻击的易受攻击的代码的示例:

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  // 进行一个资源密集型操作
  while (true) {}
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

在此示例中,服务器容易受到 DoS 攻击,因为它无法正确处理传入请求。如果攻击者向端点发送大量请求,服务器将在尝试执行无限循环时变得无响应。

为了防止此类漏洞,正确处理和验证传入请求并限制单个请求可以消耗的资源量非常重要。在上面的示例中,这可以通过使用中间件来限制最大请求数来完成。我们可以使用一个很好的包来为我们处理这个问题,express-rate-limit 并像这样使用它:

const express = require("express");
const app = express();
const rateLimit = require("express-rate-limit");

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 100, // 将每个 I P限制为最多发送100个请求
  message: "请求超时,请稍后再试",
});

app.use(limiter);

app.get("/", (req, res) => {
  res.send("Hello, World!");
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

错误的认证和授权

错误的身份验证和授权可能会导致未经授权访问敏感数据,从而导致盗窃或损坏。为了防止这种情况,实施正确的身份验证和授权方法非常重要,例如使用安全密码和双因素身份验证。

以下是容易受到不正确身份验证的代码示例:

const express = require("express");
const app = express();

app.get("/secret", (req, res) => {
  res.send("This is a secret page!");
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

在此示例中, /secret 端点未受到适当保护,任何知道 URL 的人都可以访问它。

为了防止此类漏洞,正确实施和强制执行身份验证机制非常重要。在上面的示例中,这可以使用身份验证中间件来完成,如下所示:

const express = require("express");
const app = express();

const checkAuth = (req, res, next) => {
  if (!req.session.user) {
    return res.status(401).send("Unauthorized");
  }
  next();
};

app.get("/secret", checkAuth, (req, res) => {
  res.send("This is a secret page!");
});

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});

在此示例中,checkAuth 中间件用于在访问 /secret 端点之前检查用户是否经过身份验证。如果用户未通过身份验证,中间件将返回 401 Unauthorized 响应。

不安全的直接对象引用

就像错误的授权一样,在不安全的直接对象引用中,攻击者可以直接访问和操作对象,绕过预期的安全控制。以下是 Node.js 中此类漏洞的示例:

const express = require("express");
const app = express();

const users = [
  { id: 1, name: "John Doe" },
  { id: 2, name: "Jane Doe" },
];

app.get("/user/:id", function (req, res) {
  let user = users.find((user) => user.id == req.params.id);

  if (!user) {
    res.status(404).send("User not found");
    return;
  }

  res.send(user);
});

app.listen(3000);

在上面的示例中,代码根据 URL 中传递的 id 参数(例如 /user/1 )从 users 数组中检索用户。

这是不安全的直接对象引用的典型示例,因为攻击者可能会操纵 URL 中的 id 参数来访问其他用户的数据。为了缓解此漏洞,代码应检查正在检索的用户是否有权由当前用户访问。

总结

Node.js 是一项强大且广泛使用的技术,但了解潜在的漏洞也很重要。通过遵循最佳实践并采取主动措施,你可以确保 Node.js 应用程序的安全并保护敏感数据。请随意在你的计算机上运行代码片段并进行试验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1584777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】OpenMetadata 命令执行漏洞复现(CVE-2024-28255)

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

【MySQL数据库 | 第二十六篇】InnoDB基本数据存储单元以及存在问题

前言&#xff1a; InnoDB作为MySQL中最常用的存储引擎之一&#xff0c;承载着许多数据库系统的关键任务&#xff0c;如事务管理、并发控制和数据完整性保障。 然而&#xff0c;就像任何技术一样&#xff0c;InnoDB也并非完美无缺。在深入了解其工作原理和特性的同时&#xff…

宏集PLC如何为楼宇自动化行业提供空调、供暖与通风的解决方案?

一、应用背景 楼宇自动化行业是通过将先进的技术和系统应用于建筑物中&#xff0c;以提高其运营效率、舒适度和能源利用效率的行业&#xff0c;其目标是使建筑物能够自动监控、调节和控制各种设备和系统&#xff0c;包括照明系统、空调系统、安全系统、通风系统、电力供应系统…

头歌-机器学习 第13次实验 特征工程——共享单车之租赁需求预估

第1关&#xff1a;数据探索与可视化 任务描述 本关任务&#xff1a;编写python代码&#xff0c;完成一天中不同时间段的平均租赁数量的可视化功能。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 读取数据数据探索与可视化 读取数据 数据保存在./step1/…

JUC:实现一个简易的数据库连接池(享元模式)

主要是学习享元模式。 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享尽可能多的对象来最小化内存使用和提高性能。在该模式中&#xff0c;对象被分为两种状态&#xff1a;内部状态和外部状态。 内部状态&#xff08;Intr…

[SystemVerilog]常见设计模式/实践

常见设计模式/实践 RTL 设计&#xff08;尤其是 ASIC&#xff09;的最终目标是制作出最小、最快的电路。为此&#xff0c;我们需要了解综合工具如何分析和优化设计。此外&#xff0c;我们还关注仿真速度&#xff0c;因为等待测试运行实际上是在浪费工程精力。虽然综合和仿真工…

智造未来,引领潮流:中科美菱新品发布展现制造新力量

2024年3月30日&#xff0c;中科美菱在第十六届中国整合生物样本学大会上瞩目亮相&#xff0c;发布了其全新力作—云智安菱睿系列全自动超低温样本存储设备SU-80。同时&#xff0c;公司还携云智安自动化样本库解决方案闪耀昆明。这一新品的华丽登场&#xff0c;不仅向世界展示了…

本地域名解析DNS

本地域名解析&#xff1a; - 需要修改本地hosts&#xff0c;增加映射 - windows hosts文件目录 c:\windows\system32\drivers\etc\hosts - 增加映射 22.100.10.122 gitlab.xxx.cn

爬取豆瓣(线程、Session)优化版本

爬取豆瓣&#xff08;线程、Session&#xff09;优化版本 该文章只是为了精进基础&#xff0c;对Session、threading、网站请求解析的理解。 此版本没有爬取详情页。还在学习阶段的读者可以尝试一下。 适用于基础刚开始学习爬虫的&#xff01; 1.改进点&#xff1a; 将普通的r…

JDK版本升级后连不上MySQL数据库的问题

1. 问题描述 用户在将 JDK 版本从 8 升级到 11 后&#xff0c;发现应用无法连接到 MySQL 数据库&#xff0c;出现连接超时或连接被拒绝的错误。 例如出现如下报错信息&#xff1a; 可能原因&#xff1a; JDBC驱动版本不兼容&#xff1a; 新的 JDK 11 可能需要使用更高版本的 My…

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测 目录 时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索…

数据的未来:人工智能引领下的大数据革命

大数据是指在一定时间范围内&#xff0c;无法通过常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;这种数据具有海量、高增长率和多样化的特点&#xff0c;需要采用新的处理模式才能发挥其更强的决策力、洞察发现力和流程优化能力。大数据将数据视为核心资源&#xff0…

Vue 项目如何在VSCode中进行断点调试

概要&#xff1a; 简单介绍一下&#xff0c;在VSCode中如何对Vue项目进行断点调试。具体内容包括但不限于&#xff1a;如何配置调试环境、如何在代码中设置断点、如何启动调试以及如何解决在调试过程中可能遇到的问题。 实际开发中&#xff0c;我们的前端项目一般都是在浏览器…

11 flink-sql 中基于 mysql-cdc 连接 mysql-pxc 集群无法获取增量数据问题

前言 问题是来自于 群友, 2024.03.29, 也是花了一些时间 来排查这个问题 大致的问题是用 mysql-cdc 连接了一个 mysql-pxc 集群, 然后创建了一个 test_user 表 使用 "select * from test_user" 获取数据表的数据, 可以拿到 查询时的快照, 但是 无法获取到后续对…

使用QT 开发不规则窗体

使用QT 开发不规则窗体 不规则窗体贴图法的不规则窗体创建UI模板创建一个父类创建业务窗体main函数直接调用user_dialog创建QSS文件 完整的QT工程 不规则窗体 QT中开发不规则窗体有两种方法&#xff1a;&#xff08;1&#xff09;第一种方法&#xff0c;使用QWidget::setMask函…

CSS伪元素::after清除浮动样式

一.代码 1.清除前 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </h…

Vue3学习01 Vue3核心语法

Vue3学习 1. Vue3新的特性 2. 创建Vue3工程2.1 基于 vue-cli 创建项目文件说明 2.2 基于 vite 创建具体操作项目文件说明 2.3 简单案例(vite) 3. Vue3核心语法3.1 OptionsAPI 与 CompositionAPIOptions API 弊端Composition API 优势 ⭐3.2 setup小案例setup返回值setup 与 Opt…

[计算机效率] 看图工具:Honeyview

3.23 看图工具&#xff1a;Honeyview Honeyview是一款轻量级、快速且功能强大的图片浏览器&#xff0c;具有多种强大的功能和特点。 多种图像格式支持&#xff1a;Honeyview支持几乎所有常见的图像格式&#xff0c;包括JPG、PNG、BMP、GIF等&#xff0c;甚至包括一些不常见的格…

搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s概述 2、NFS简介 二、NFS服务器…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day8

Day 8 classification &#xff1a;Probabilistic Generative Model 今天上了一整天的课&#xff0c; 本来实在是更新不动了&#xff0c;但是看到《剑来》更新了&#xff0c;想一想这本书里面一直强调的成功的feature – 心性&#xff0c;嗯心性坚毅就好&#xff01;主人公陈平…