我正在使用 Express.js、TypeScript 和 MongoDB (Mongoose) 开发 Node.js API,我担心 XSS 攻击等安全漏洞。具体来说,我的目标是确保用户提供的包含 HTML 标签的输入数据在将其保存在我的数据库中之前经过清理。目前所有 html 标签都安全地保存在数据库中。
在此技术堆栈中实施输入清理以有效降低 XSS 风险的推荐方法或最佳实践是什么?
为了增强 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 攻击的风险。请记住,安全是一个持续的过程,您应该随时了解最佳实践和新漏洞。
祝你好运;)