SQL 在 REST 中使用 JPA 规范注入 Api

SQL Injection using JPA Specification in REST Api

在我的 REST 控制器中,我使用 Specification 来构建动态查询,即(这个 class 的缩写版本,实际上它有更多字段):

public class FileHistorySpecification implements Specification<FileHistory> {


private String filename;

@Override
public Predicate toPredicate(Root<FileHistory> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
  final Collection<Predicate> predicates = new ArrayList<>();

    if(filename!=null) {
        final Predicate filenamePredicate = cb.like(root.get("filename"), "%"+filename+"%");
        predicates.add(filenamePredicate);
    }
    return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}

}

它工作正常,即:当我输入:localhost:8080/fileshistory?filename=test 它给了我所有匹配的文件文件,但问题是 - 这样安全吗?如何测试这是否容易受到 sql 注入?

您的代码将创建一个带有绑定变量的查询。您可以在将 Hibernate 记录器 org.hibernate.SQL 设置为在 application.properties

中进行调试时进行检查
logging.level.org.hibernate.SQL=DEBUG

您应该会看到带有 ?占位符。

使用绑定变量可以防止 SQL 注入。阅读有关此主题的更多信息以及如何对其进行测试:

https://vladmihalcea.com/a-beginners-guide-to-sql-injection-and-how-you-should-prevent-it/