我有一个使用 Ebean Finder 对象的查询。这是一个工作版本:
public static Finder<Long, Device> find = new Finder<>(Long.class, Device.class);
.
public static Page<Device> find(int page, String sorting, String order) {
return
find.where()
.orderBy(sorting + " " + order)
.findPagingList(10)
.setFetchAhead(false)
.getPage(page);
}
但现在我想通过使用 setParameter 函数使其成为 SQLInjection 安全的,我尝试了这个,但没有成功。很高兴知道我做错了什么。
public static Page<Device> find(int page, String sorting, String order) {
return
find.where()
.orderBy(":sorting :order")
.setParameter("sorting", sorting)
.setParameter("order", order)
.findPagingList(10)
.setFetchAhead(false)
.getPage(page);
}
更新:
如上所述here ,
"The problem is you can't use named parameters to set the ORDER in an HQL (or SQL) query."
如果属实,这会使我的代码容易受到 SQL 注入(inject)攻击!那么你的建议是什么?
最佳答案
我无法判断 Ebean 有多安全,但您可以看到传递给 orderBy 的字符串已被解析: OrderBy.java
例如,如果我写:
find.where()
.ilike("name", "%" + filter + "%")
.orderBy("1;DROP TABLE company")
.fetch("company")
.findPagingList(pageSize)
.setFetchAhead(false)
.getPage(page);
我得到这个异常:
[RuntimeException: Expecting a max of 2 words in [[1;DROP, TABLE, company]] but got 3]
关于java - 使用 setParameter 进行 ebean 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27821088/