使用 NamedParameterJdbcTemplate 从文件中读取参数化查询解决来自 Checkmarx 的 SQL 注入错误

Resolve SQL Injection Error from Checkmarx using NamedParameterJdbcTemplate reading parameterized query from a file

提问人:pradhyo 提问时间:9/17/2022 最后编辑:baruchiropradhyo 更新时间:9/18/2022 访问量:1794

问:

查询是从 java spring boot 应用程序的 resources 文件夹中的文件中读取的。 如何在下面的代码中防止Checkmarx出现此Sql注入错误?

@Repository
public class ItemRepository {

  @Autowired
  NamedParameterJdbcTemplate jdbcTemplate;

  public List<Item> getData(String action) {
    String sql = IOUtils.toString(getClass().getResourceAsStream("queries/query.sql"));
    MapSqlParameterSource parameters = new MapSqlParameterSource();
    parameters.addValue("action", action, Types.VARCHAR);

    try {
      List<Item> items = jdbcTemplate.query(sql, parameters, new ItemMapper());
      return items;
    } catch (EmptyResultDataAccessException ex) {
      return new ArrayList<>();
    }
  }
}

错误信息:

应用程序的方法在 的第 13 行使用 执行 SQL 查询。应用程序通过将不受信任的字符串嵌入到查询中来构造此 SQL 查询,而无需进行适当的清理。串联的字符串被提交到数据库,在那里它被解析并相应地执行。
攻击者可以通过构建恶意有效负载并通过输入提供它,将任意语法和数据注入 SQL 查询;然后,此输入由 的第 8 行中的方法读取。然后,此输入流经代码,进入查询并流向数据库服务器 - 无需清理。
这可能会引发 SQL 注入攻击。
getDataqueryItemRepository.javatoStringgetDataItemRepository.java

java sql spring-boot sql 注入 checkmarx

评论

0赞 yaloner 9/29/2022
您使用的是哪个版本的Checkmarx SAST?
0赞 pradhyo 9/30/2022
我看到它是V 9.4.5 HF15

答:

0赞 Egret 9/18/2022 #1

Checkmarx可能会抱怨SQL字符串来自流。在这种特定情况下,它来自 jar 中的资源文件,该文件可能是应用程序中的受信任源。如果是这样,则这是一个误报,您应该将其标记为“不可利用”(具有适当的推理)。

评论

0赞 pradhyo 9/30/2022
是的,我联系了管理员并将其标记为不可利用。
0赞 yaloner 10/2/2022
只有当你 100% 信任文件的内容时,你才应该这样做。来自文件的恶意负载仍可能导致存储的 SQL 注入攻击。
0赞 pradhyo 10/5/2022
@yaloner我信任这个文件,但说我不信任,有什么更安全的方法来编写此代码?
1赞 Egret 10/6/2022
@pradhyo - 无法清理或验证完整的 SQL 语句(甚至片段)。这绝不应是来自不受信任源的值。正确的做法是将其拆分为来自受信任来源的 SQL 和参数(来自不受信任的来源)。参数将在参数化查询中使用或进行正面验证。