hibernate - 在 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 注入的影响?
解决方案
您的代码将创建一个带有绑定变量的查询。您可以在将 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/
推荐阅读
- mysql - 平均函数没有返回正确的值
- rest - 没有库的 Groovy REST 客户端
- flutter - 将 gif 放在按钮 Flutter 后面
- go - 瞪羚+protobuf 问题:没有强制提供者:'GoLibrary'
- java - 我应该在 Android 中使用 Java JDBC 进行 Mysql 连接吗?一般是怎么做的?
- python - 在 python 中更改 .json 文件
- html - 用户从 Web 表单上传图像
- node.js - 在 Linode 服务器上运行的 Docker 容器无法连接到 mongo atlas 集群
- java - 如何使用用户设置打印 PDF 文档?
- oracle - Oracle:日期和时间戳之间的差异(0)