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.mzph.cn/news/806826.shtml

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

相关文章

基于springboot的扶贫产品和扶贫物资捐赠系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的扶贫产品和扶贫物资捐赠系统2拥有管理员和用户角色 管理员&#xff1a;用户管理、扶贫项目管理、物资管理、扶贫产品管理、捐赠管理、资讯管理等 用户&#xff1a;捐赠…

nginx+uWsgi应用部署方式

uWSGI 是一个快速的、纯C语言开发的、自维护的、对开发者友好的 WSGI 服务器&#xff0c;旨在提供专业的 Python web应用发布和开发。可使用 C/C/Objective-C 来为 uWSGI 编写插件。在这里要区分三个概念&#xff1a; WSGI&#xff1a;全称是Web Server Gateway Interface&…

Visual Studio C++ 正确创建项目与更改文件名

1、创建项目 1&#xff09;打开Visual Studio&#xff0c;选择创建新项目。 2&#xff09;创建空项目 3&#xff09;配置新项目&#xff0c;注意不要勾选 " 将解决方案和项目放在同一目录中 " 。并将位置的文件夹设为与解决方案同名&#xff0c;方便管理。项目名称则…

spispi

硬件部分可参考我另一篇文章 http://t.csdnimg.cn/4j3qT 接线图 这是课程的相关接线图&#xff0c;独立看门狗和窗口看门狗都适用本图 独立看门狗部分 一、配置流程 1.开启时钟 在数据手册里面有这么一段解释&#xff0c;就是说如果我们开启了看门狗&#xff0c;那么LSI就…

PTA 2813:画家问题(熄灯问题)

有一个正方形的墙&#xff0c;由NN个正方形的砖组成&#xff0c;其中一些砖是白色的&#xff0c;另外一些砖是黄色的。Bob是个画家&#xff0c;想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i,j)个位置的砖时&#xff0c; 位置(i−1,j)、 (i1,j)、(i,j−1)、(i…

掌握判断IPv4地址是否正确的方法

在数字通信和互联网领域中&#xff0c;IPv4地址作为标识网络设备的核心元素&#xff0c;其正确性至关重要。一个有效的IPv4地址能够确保设备在网络中的正常通信和交互&#xff0c;而错误的IPv4地址则可能导致连接失败、通信中断甚至网络安全问题。因此&#xff0c;掌握判断IPv4…

SQL注入sqli_labs靶场第二题

解题思路与第一题相同 ?id1 and 11 和?id1 and 12进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为数字型注入。 联合查询&#xff1a; 猜解列名数量&#xff1a;3 ?id1 order by 4 判断回显…

防止邮箱发信泄露服务器IP教程

使用QQ邮箱,网易邮箱,189邮箱,新浪邮箱,139邮箱可能会泄露自己的服务器IP。 泄露原理&#xff1a;服务器通过请求登录SMTP邮箱服务器接口&#xff0c;对指定的收件人发送信息。 建议大家使用商业版的邮箱&#xff0c;比如阿里云邮箱发信等 防止邮件发信漏源主要关注的是确保邮件…

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

Day7 Regression Case study &#xff08;预测宝可梦的cp&#xff09; Regression 可以做什么&#xff1f; 股票预测 自动驾驶 推荐 预测宝可梦的cp&#xff08;能力类似这样的属性把&#xff09; 这里突然想到&#xff0c;是不是可以用洛克王国和赛尔号做事情哈哈 注意&#…

6种xinput1_3.dll丢失的解决办法,并探讨xinput1_3.dll丢失的原因及其属性。

xinput1_3.dll扮演着Visual C运行时库中不可或缺的角色&#xff0c;众多电脑软件都需依赖它以确保正常运行。 当您启动软件时&#xff0c;若遇到xinput1_3.dll无法执行代码的提示&#xff0c;可能会导致软件无法如常启动或运行。本文将向您介绍6种解决方案&#xff0c;并探讨xi…

Java基于微信小程序的乐室预约系统(V2.0),附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

WEB前端-倒计时练习

<body><div>距离2024年7月3日还有&#xff1a;<br><span id"d">0</span>天<span id"h">0</span>小时<span id"m">0</span>分钟<span id"s">0</span>秒</div>…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《新型电力系统多阶段输-储协同分布鲁棒规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【PHP系统学习】——Laravel框架数据库的连接以及数据库的增删改查的详细教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

蓝桥杯——考勤刷卡

题目 小蓝负责一个公司的考勤系统,他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗。 当员工刷卡时,会在后台留下一条记录,包括刷卡的时间和员工编号,只 要在一天中员工刷过一次卡,就认为他到岗了。 现在小蓝导出了一天中所有员工的刷卡记录,请将所有到岗员工的员工编…

创建网络名称空间后的Linux幕后工作解析

Linux网络名称空间&#xff08;Network Namespace&#xff09;是一种强大的虚拟化技术&#x1f310;&#xff0c;允许用户隔离网络设备、IP地址、路由表等网络资源。这项技术在容器化和虚拟化领域发挥着关键作用&#xff0c;是构建现代云基础设施的基石之一⛅。当你创建一个新的…

Quanto: PyTorch 量化工具包

量化技术通过用低精度数据类型 (如 8 位整型 (int8)) 来表示深度学习模型的权重和激活&#xff0c;以减少传统深度学习模型使用 32 位浮点 (float32) 表示权重和激活所带来的计算和内存开销。 减少位宽意味着模型的内存占用更低&#xff0c;这对在消费设备上部署大语言模型至关…

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

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

[opencv]VideoWriter写出fourcc格式

fourcc支持的格式 fourcc全名Four-Character Codes&#xff0c;四字符代码&#xff0c;该编码由四个字符组成 cv2.VideoWriter_fourcc(O,O,O,O) cv2.VideoWriter_fourcc(*OOOO) 通常写法有上述两种形式&#xff0c;O代表一个字符&#xff0c;通常有 支持avi格式的有&#…

花样鼠标悬停特效

代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&…