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/
在我的 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/