【问题标题】:ebean query with setParameter使用 setParameter 进行 ebean 查询
【发布时间】:2015-03-05 10:39:17
【问题描述】:

我有一个使用 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

“问题是您不能使用命名参数在 HQL(或 SQL)查询中设置 ORDER。”

如果为真,这会使我的代码容易受到 SQL 注入的攻击!那你有什么建议?

【问题讨论】:

    标签: java playframework ebean


    【解决方案1】:

    我不知道 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] 
    

    【讨论】:

    • 感谢源码,说明对于OrderBy属性,不能乱参数!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多