使用setParameter查询ebean

时间:2015-01-07 13:57:29

标签: java playframework ebean

我有一个使用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注入的攻击!你的建议是什么?

1 个答案:

答案 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]