java - Spring Boot 中的 SQL 注入(inject)预防

标签 java spring-boot spring-data-jpa checkmarx

我的 Checkmarx 报告在我的 Spring Boot 应用程序中将此方法标记为严重性二阶 SQL 注入(inject):

public void updateEmployees(int storeId) {
  List<Employee> employees = employeeRepo.findByStoreId(storeId);
  employees.stream().forEach(e->{
    e.setActive('Y');
    employeeRepo.save(s);
  });
}

根据 Checkmarx:

... The application constructs this SQL query by embedding an untrusted string into the query without proper sanitization. The concatenated string is submitted to the database, where it is parsed and executed accordingly.

setActive(‘Y’) 行似乎是问题所在。

我找到的有关 Spring Data JPA 使用的数据清理的指南建议使用从EntityManager实例创建的TypedQuery。像这样的东西:

String jql = "from Employee where storeId = :storeId";
TypedQuery<Account> q = em.createQuery(jql, Employee.class)
  .setParameter("storeId", storeId);

但是,在我的应用程序中,EntityManager 是由 Spring Boot 隐式创建的。

因此,为了在这里实现“适当的清理”,我是否需要显式创建 EntityManager 实例(以访问其 createQuery 方法)?或者是否有更直接的方法来实现这一点,不需要显式的 EntityManager 实例化?

最佳答案

这是误报,您需要联系供应商并通知他们此情况。当Hibernate生成SQL时,它使用PreparedStatement。您更改的所有实体字段都将与查询分开发送 - 不会有任何串联。

Spring Data 不会改变 Hibernate 处理实体的方式。因此,这要么是误报,要么您正在查看错误的代码行。

关于java - Spring Boot 中的 SQL 注入(inject)预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72001344/

相关文章:

java - 使用 %f %s(我认为是 Java 7 格式化程序)类型表示法格式化日期

java - Ant 和 File.isDirectory()

java - 使用 PreparedStatement (JDBC) 时如何打印使用过的 SQL 查询

spring - 如何在 Spring Reactor Web 应用程序中执行一系列操作并确保一个操作在下一个操作之前完成?

java - 当复合键与实体一起使用时,分离的实体被传递以保留

java - 正则表达式匹配链接文本与 href 值不同的 anchor 标记

java - 具有 ThreadLocal 变量行为的单例 bean

java - 发布 NewRelicMeterRegistry 时如何过滤计量

hibernate - Spring JPA 存储库为更新子句生成错误的 native 查询

java - Spring Integration 和 JPA 更新出站网关时出现循环引用错误