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

这篇具有很好参考价值的文章主要介绍了Node.js 的 5 个常见服务器漏洞。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

Node.js 的 5 个常见服务器漏洞,node.js,服务器,运维,前端,react.js,javascript

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 应用程序的安全并保护敏感数据。请随意在你的计算机上运行代码片段并进行试验。文章来源地址https://www.toymoban.com/news/detail-851121.html

到了这里,关于Node.js 的 5 个常见服务器漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 超简单的node.js服务器配置(1)

    node安装教程我之前有出过,不会的可以去看一下(node.js安装教程) 1.引入http模块(这个模块是node.js内置的模块) 2.创建服务器实例并监听端口(8080)开启服务器,监听客户端请求并进行处理 打开服务器地址 127.0.0.1:8080/ 查看一下效果: http.createServer()方法有一个参数为回调函数

    2024年02月15日
    浏览(35)
  • 第六章认识Node.js服务器开发

    目录 Node.js同步和异步编程 基本概念 执行方式 获取异步API的返回值 网页基础扩展 项目 Node.js同步和异步编程 基本概念 同步API(应用程序编程接口)是指只有当前API执行完毕后才能继续执行下一个API。 形象的说同步模式就是一个服务员在某一个时间段内只服务一个客人的模

    2024年02月05日
    浏览(39)
  • 第五章认识Node.js服务器开发

    目录 认识服务器开发 基本概念 基本作用 基本优势 基本组成 Node.js网站服务器 基本概述 基本步骤 基本特点 认识HTTP协议 基本概述 HTTP的请求消息和响应消息 请求消息 响应消息 HTTP请求处理与响应处理 GET请求参数 POST请求参数 路由 静态资源访问 认识服务器开发 基本概念 服

    2024年02月07日
    浏览(39)
  • 【使用Node.js搭建自己的HTTP服务器】

    Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高

    2024年02月11日
    浏览(42)
  • 【服务器】CentOS 7 安装Node.js开发环境

    部署Node.js环境(使用NVM安装多个Node.js版本): NVM(Node VersionManager)是Node.js的版本管理软件,使您可以轻松在Node.js各个版本间进行切换。适用于长期做node开发的人员或有快速更新node版本、快速切换node版本的场景。 具体操作步骤如下: 服务器系统 :CentOS 7.9.2009 x86_64(Py3.7.9) a. 安

    2024年01月25日
    浏览(45)
  • 使用VsCode搭建Node.js服务器开发环境

    使用VsCode搭建Node.js服务器开发环境 在进行Node.js服务器开发时,一个好的集成开发环境可以帮助您更快地编写代码,并且提高程序的效率。在此推荐安装配置VSCode作为Node.js服务器开发环境,下面介绍安装配置过程。 Step 1:下载安装VSCode 首先我们需要访问VSCode官网(https://c

    2024年02月15日
    浏览(42)
  • 微信小程序搭载node.js服务器(简)

    此文章用到的是用node.js搭载的服务器! 检测电脑是否安装node.js,可以用【 cmd/Power shell 】命令检测,也可以用【git-bash】,这里就用git-bash进行演示,没有git-bash可以安装一下。 如果有对应的版本号即为已经安装完成! 未安装的附上链接了: node.js安装 : Download | Node.js Gi

    2023年04月08日
    浏览(36)
  • 【小沐学前端】Node.js搭建HTTPS 服务器

    HTTPS是什么?HTTPS是基于TLS/SSL的HTTP协议。 HTTPS (全称:Hypertext Transfer Protocol Secure),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存

    2024年02月03日
    浏览(33)
  • 【小沐学Web】Node.js搭建HTTPS 服务器

    HTTPS是什么?HTTPS是基于TLS/SSL的HTTP协议。 HTTPS (全称:Hypertext Transfer Protocol Secure),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存

    2024年02月11日
    浏览(44)
  • 如何使用Node.js快速创建本地HTTP服务器并实现公网访问服务端

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包