首页 > 解决方案 > 在 REST Api 中使用 JPA 规范进行 SQL 注入

问题描述

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

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 注入的影响?

标签: hibernatespring-bootsql-injectionspring-rest

解决方案


您的代码将创建一个带有绑定变量的查询。您可以在将 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/


推荐阅读