我有一个使用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,
&#34;问题是您无法使用命名参数在HQL(或SQL)查询中设置ORDER。&#34;
如果为true,这会使我的代码容易受到SQL注入的攻击!你的建议是什么?
答案 0 :(得分:2)
我无法分辨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]