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

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.rhkb.cn/news/304420.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式面向对象学习 RT-Thread I/O 设备管理框架 设备驱动层 案例测试

嵌入式面向对象 RT-Thread I/O 设备管理框架 设备驱动层 注&#xff1a;本文介绍性内容转载于《RT-Thread记录&#xff08;十、全面认识 RT-Thread I/O 设备模型&#xff09;》 注&#xff1a; 本次使用的开发板 &#xff1a; ​ 兆易创新GD32F407VET6开发板 ​ 雅特力科技…

nginx配置证书和私钥进行SSL通信验证

文章目录 一、背景1.1 秘钥和证书是两个东西吗&#xff1f;1.2 介绍下nginx配置文件中参数ssl_certificate和ssl_certificate_key1.3介绍下nginx支持的证书类型1.4 目前nginx支持哪种证书格式&#xff1f;1.5 nginx修改配置文件目前方式也会有所不同1.6 介绍下不通格式的证书哪…

微服务-4 Nacos

目录 一、注册中心 二、配置管理 1. 添加配置 2. 配置自动刷新 3. 多环境配置共享​编辑 一、注册中心 服务列表&#xff1a; 服务详情&#xff1a; 二、配置管理 1. 添加配置 (1). 在 nacos 界面中添加配置文件&#xff1a; 配置列表&#xff1a; 配置详情&#xff1a;…

Qt之QSS样式表

QSS简介 QSS&#xff08;Qt Style Sheet&#xff09;样式表是一种用于描述图形用户界面&#xff08;GUI&#xff09;样式的语言。它允许开发者为应用程序的控件定义视觉外观&#xff0c;例如颜色、字体、尺寸和布局等。 QSS 样式表的主要目的是提供一种简洁而灵活的方式来美化…

【优选算法专栏】专题四:前缀和(一)

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

DRF 常用功能

文章目录 一、主流认证方式Session认证Token认证JWT认证 二、DRF认证与权限Session认证所有视图&#xff08;全局&#xff09;启用认证视图级别启用认证 Token认证[推荐]安装APP启用Token认证生成数据库表(因为token要存储到数据库&#xff09;配置Token认证接口URL获取token使…

迭代器模式【行为模式C++】

1.简介 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合&#xff08;聚合对象&#xff09;底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合&#xff08;聚合对象&#xff09;中所有的元素。 迭代器的意义就是将这个行为抽离封装起来&a…

STM32F4 IAP跳转APP问题及STM32基于Ymodem协议IAP升级笔记

STM32F4 IAP 跳转 APP问题 ST官网IAP例程Chapter1 STM32F4 IAP 跳转 APP问题1. 概念2. 程序2.1 Bootloader 程序 问题现象2.2. APP程序 3. 代码4. 其他问题 Chapter2 STM32-IAP基本原理及应用 | ICP、IAP程序下载流程 | 程序执行流程 | 配置IAP到STM32F4xxxChapter3 STM32基于Y…

SQLite数据库在Linux系统上的使用

SQLite是一个轻量级的数据库解决方案&#xff0c;它是一个嵌入式的数据库管理系统。SQLite的特点是无需独立的服务器进程&#xff0c;可以直接嵌入到使用它的应用程序中。由于其配置简单、支持跨平台、服务器零管理&#xff0c;以及不需要复杂的设置和操作&#xff0c;SQLite非…

python如何输入多行

Python中的Input()函数在输入时&#xff0c;遇到回车符&#xff0c;那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形&#xff0c;当然输入空行也是允许的。 方法1&#xff1a;利用异常处理机制实现 lines[] while True:try:lines.append(input())except:…

达梦数据库清理归档日志的方法

达梦数据库清理归档日志的方法 在达梦数据库&#xff08;DM数据库&#xff09;中&#xff0c;归档日志文件是数据库运行过程中产生的&#xff0c;用于记录所有对数据库修改的详细信息。这些日志对于数据库的恢复非常关键&#xff0c;尤其是在进行灾难恢复或数据恢复时。然而&a…

关于Linux下的进程等待(进程篇)

目录 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 怎样去执行进程等待&#xff1f; status options 为什么存在进程等待&#xff1f;进程等待是在做什么&#xff1f; 代码示例&#xff1a;模仿僵尸进程 #include <stdio.h> #include <unistd.…

xss跨站脚本攻击笔记

1 XSS跨站脚本攻击 1.1 xss跨站脚本攻击介绍 跨站脚本攻击英文全称为(Cross site Script)缩写为CSS&#xff0c;但是为了和层叠样式表(CascadingStyle Sheet)CSS区分开来&#xff0c;所以在安全领域跨站脚本攻击叫做XSS 1.2 xss跨战脚本攻击分类 第一种类型:反射型XSS 反射…

java数据结构与算法刷题-----LeetCode684. 冗余连接

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 并查集 并查集 解题思路&#xff1a;时间复杂度O( n ∗ l o g 2…

ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC

ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…

JVM规范中的运行时数据区

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

SpringBoot 集成H2数据库,启动执行sql, 中文乱码

目录 H2数据库介绍 SpringBoot版本&#xff1a;SpringBoot 2.1.12.RELEASE 快速集成H2&#xff0c;maven依赖 快速集成H2&#xff0c;数据源及关键参数配置 spring.datasource.schema参数&#xff08;建表SQL脚本&#xff09; spring.datasource.data参数&#xff08;更新、…

Qt5 编译 Qt Creator 源码中的 linguist 模块

文章目录 下载 Qt Creator 源码手动翻译多语言自动翻译多语言 下载 Qt Creator 源码 Github: https://github.com/qt/qttools 笔记打算用 Qt 5.12.12 来编译 qt creator-linguist 所以笔者下载的是 tag - 5.12.12 &#xff0c;解压后如下&#xff0c;先删除多余的文件&#xf…

【Vue】Vue3中的OptionsAPI与CompositionAPI

文章目录 OptionsAPICompositionAPI对比总结 OptionsAPI 中文名:选项式API通过定义methods,computed,watch,data等属性方法&#xff0c;处理页面逻辑。以下是OptionsAPI代码结构 实例代码: <script lang"ts">// js或者tsimport { defineComponent } from vu…

【学习】软件测试需求分析要从哪些方面入手

软件测试需求分析是软件测试过程中非常重要的一个环节&#xff0c;它是为了明确软件测试的目标、范围、资源和时间等要素&#xff0c;以确保软件测试的有效性和全面性。本文将从以下几个方面对软件测试需求分析进行详细的阐述&#xff1a; 一、软件测试目标 软件测试目标是指…