我想通过从用户提供的输入数据中删除 HTML 和 JavaScript 以防止 XSS 攻击来增强 API 的安全性

问题描述 投票:0回答:1

我正在使用 Express.js、TypeScript 和 MongoDB (Mongoose) 开发 Node.js API,我担心 XSS 攻击等安全漏洞。具体来说,我的目标是确保用户提供的包含 HTML 标签的输入数据在将其保存在我的数据库中之前经过清理。目前所有 html 标签都安全地保存在数据库中。

在此技术堆栈中实施输入清理以有效降低 XSS 风险的推荐方法或最佳实践是什么?

node.js typescript mongodb express mongoose
1个回答
0
投票

为了增强 API 的安全性并防止 XSS 攻击,清理用户输入至关重要。清理涉及清理输入数据以确保其安全存储和显示。以下是 Node.js/Express.js 应用程序中输入清理的推荐方法:

使用中间件进行清理

express-validator: 该中间件包含清理方法。您可以在处理路由以清理输入时定义验证链。

const { body, validationResult } = require('express-validator');

    app.post('/user',
      body('name').trim().escape(), // Trims and escapes HTML entities
      body('email').isEmail().normalizeEmail(),
      (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
          return res.status(400).json({ errors: errors.array() });
        }
        // Process ...
      }
    );

sanitize-html:这是一个库,允许您指定允许的标签和属性,以有效防止 XSS,同时如果需要,仍然允许 HTML 子集用于格式化目的。

const sanitizeHtml = require('sanitize-html');

function sanitizeInput(input) {
  return sanitizeHtml(input, {
    allowedTags: [], //Empty array means no HTML tags allowed
    allowedAttributes: {}
  });
}

const safeInput = sanitizeInput(req.body.someUserInput);

实施内容安全策略(CSP)

尽管清理输入很重要,但实施内容安全策略 (CSP) 可以增加额外的安全层。 CSP 是一个附加标头,有助于检测和缓解某些类型的攻击,包括 XSS 和数据注入攻击。

您可以使用头盔中间件设置CSP:

const helmet = require('helmet');

    app.use(
      helmet.contentSecurityPolicy({
        directives: {
          defaultSrc: ["'self'"], // Only allow scripts from the same origin
          // Add other directives if you needed
        }
      })
    );

验证和清理数据

始终在客户端和服务器端验证和清理数据。仅客户端验证是不够的,因为它可以被绕过。

在 MongoDB 中使用参数化查询

为了防止注入攻击,请使用参数化查询而不是字符串连接。使用 Mongoose,只要您正确使用 Mongoose 方法并且不使用字符串连接从用户输入构建查询,通常就会为您处理这个问题。

转义输出

显示用户生成的内容时,请确保转义任何可能被浏览器解释的 HTML。这可以在将数据发送到前端之前在服务器端完成,也可以在前端本身完成,具体取决于您的架构。

定期更新依赖项

使用 npmaudit 或 snyk 等工具检查是否存在易受攻击的软件包。使您的依赖项保持最新可以防止可能被利用的已知漏洞。

实施这些策略将显着增强 API 的安全性并降低 XSS 攻击的风险。请记住,安全是一个持续的过程,您应该随时了解最佳实践和新漏洞。

祝你好运;)

© www.soinside.com 2019 - 2024. All rights reserved.