首页 > 解决方案 > 如何修复 checkmarx 错误以清理有效负载

问题描述

我有一个显示 checkmarx 错误的 Spring Boot 服务(2.4.5),我们需要清理请求有效负载。我们如何清理请求负载?

 @ApiOperation(value = "Executes new report. The response contains the new job id.")
@PostMapping(value = "/execute")
public ResponseEntity<MyResponse<Object, Void>> execute(
        @RequestBody final MyInput input) {.......}

对于“@RequestBody final MyInput input”,我收到以下 checkmarx 错误消息:

应用程序的 executeNewReport 方法在 src\main\java\com\gayathri\controllers\JobController.java 的第 82 行执行带有输入的 SQL 查询。应用程序通过将不受信任的字符串嵌入到查询中来构造此 SQL 查询,而无需进行适当的清理。连接的字符串被提交到数据库,在那里进行相应的解析和执行。这种明显的数据库访问似乎封装在外部组件或 API 中。因此,攻击者似乎能够通过更改用户输入输入(由执行方法读取)在 src\main\java\com\gayathri\controllers\ 的第 75 行将任意数据注入 SQL 查询作业控制器.java。然后,此输入通过代码流向外部 API,然后从那里流向数据库服务器,显然没有进行清理。

我想清理我的有效载荷。或者除了使用 DTO 之外没有其他选择,然后将其转换为我的数据库实体

标签: javaspring-bootsanitizationcheckmarxsecure-coding

解决方案


根据对漏洞的描述,我假设 Checkmarx 检测到的确切漏洞是“启发式 SQL 注入”。很高兴看到接收器在哪里(漏洞传播的地方),而不仅仅是源(“@RequestBody final MyInput 输入”)。

第一种方法是使用参数化或准备好的语句,这里有一个来自 OWASP 的备忘单的链接,可能对您有用

我认为 Checkmarx 还需要注意的是 encodeForSQL 函数的使用,它需要您使用 OWASP Enterprise Security API

如果您使用的是 MySQL:

input = ESAPI.encoder().encodeForSQL(new MySQLCodec(), input);

或适当更改数据库编解码器


推荐阅读