数据消毒难题:如何让 Checkmarx 通过 Node/Express 应用程序扫描
2024-03-17 17:13:31
如何通过 Checkmarx 对 Node/Express 的扫描,去除数据消毒漏洞
简介
Checkmarx 是一种静态应用程序安全测试 (SAST) 工具,可帮助识别 Node.js 应用程序中的安全漏洞。然而,它经常会标记像 request.path
和 request.url
这样的属性为“未正确消毒或验证”,即使已经尝试了各种数据消毒工具和 JavaScript 解决方案。
本文将深入探讨此问题的根本原因,并提供逐步解决方法,以确保应用程序通过 Checkmarx 扫描。
问题根源
Checkmarx 扫描主要关注输入验证和数据消毒。在 Node/Express 应用程序中,从请求对象访问的属性可能会包含恶意输入,需要在使用前进行验证和消毒。
解决方法
1. 输入验证
- 使用 Express 内置中间件或第三方库(如 Express Validator 或 Joi)验证请求数据类型、长度、范围和其他限制。
2. 数据消毒
- 使用数据消毒库(如 DOMPurify、XSS、XSS-filters 或 Node-ESAPI)删除或编码恶意输入。
3. 手动验证
- 对于自定义输入或 Checkmarx 扫描器无法识别的库,请手动验证数据是否安全。
4. 配置 Checkmarx 扫描器
- 确保 Checkmarx 扫描器已正确配置,可以识别已实施的消毒机制。
代码示例
以下 Node.js/Express 代码示例展示了如何实现输入验证和数据消毒:
const express = require('express');
const sanitize = require('sanitize-html');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
const sanitizer = sanitize.sanitizeHtml;
app.post('/api/submit', (req, res) => {
const userInput = sanitizer(req.body.input);
// 进一步处理已消毒的用户输入...
});
app.listen(3000, () => {
console.log('Server is listening on port 3000');
});
注意要点
- 始终对所有用户输入进行验证和消毒。
- 使用 Checkmarx 推荐的消毒库或已知可靠的第三方库。
- 避免使用不安全的消毒方法,例如
request.path.replace()
。 - 定期更新消毒库和 Checkmarx 扫描器配置以保持最新状态。
- 通过全面测试和代码审查确保解决方案的有效性。
常见问题解答
1. 为什么 Checkmarx 标记 request.path
和 request.url
为不安全?
request.path
和 request.url
可以包含恶意输入,如路径遍历或命令注入攻击,因此 Checkmarx 会标记它们为不安全。
2. 如何手动验证自定义输入?
使用正则表达式或自定义函数检查输入是否符合特定模式。例如,可以检查电子邮件地址是否包含 @
符号。
3. 如何配置 Checkmarx 扫描器?
在 Checkmarx 扫描配置中指定已使用的消毒库和任何自定义验证规则。
4. 如何确保解决方案的有效性?
通过全面测试和代码审查验证已实施的解决方案。
5. 有哪些其他方法可以提高 Node/Express 应用程序的安全性?
除了输入验证和数据消毒之外,还可以使用其他安全措施,例如身份验证、授权、加密和安全标头。