如何避免在 requestMapping 方法中使用实体造成的漏洞?

epr*_*ats 7 security spring controller sonarqube

我有一个控制器,其方法类似于

@PostMapping(value="/{reader}")
public String addToReadingList(@PathVariable("reader") String reader, Book book) {
    book.setReader(reader);
    readingListRepository.save(book);
    return "redirect:/readingList/{reader}";
}
Run Code Online (Sandbox Code Playgroud)

当我使用 Sonarqube 运行静态代码分析时,我收到一个漏洞报告,指出

用一个简单的 POJO 或 DTO 对象替换这个持久实体

但是如果我使用 DTO(它与实体类具有完全相同的字段,那么我会收到另一个错误:

1 必须删除重复的代码块

正确的解决方案应该是什么?

提前致谢。恩瑞克

Sim*_*mon 5

您应该构建一个新的单独类,将您的实体(“Book”)表示为普通旧 Java 对象 (POJO) 或数据传输对象 (DTO)。如果您使用 JSF 或其他有状态技术,则此规则很重要。如果您的实体是有状态的,则可能存在打开的 JPA 会话等,这可能会修改您的数据库(例如,如果您在有状态 bean 上调用 JSF 中的 setter)。

对于我的项目,我忽略这个声纳规则有两个原因:

  • 我总是使用 REST,REST 会将我的 Java 类映射到 JSON,可以将其视为 DTO。
  • REST 是无状态的(没有服务器会话),因此转换为 JSON 后不会打开任何数据库事务