java - 使用 setParameter 进行 ebean 查询

标签 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 ,

"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/

相关文章:

mysql - 使用单独的 OneToMany 创建 ManyToMany Join 表

java - Hadoop:LongWritable 无法转换为 org.apache.hadoop.io.IntWritable

java - 玩! JPA 和 GroupBy 框架

java - 在 Java 8 中使用可选

java - JPA:通过外键引用的表的另一个字段进行索引

database - 使用 scala play specs2 针对测试 mysql 数据库的演变

java - org.apache.axiom.om.util.AXIOMUtil 无法解析

java - 为什么我在增强 ebean scala 实体时收到 java.lang.VerifyError

java - 如何在 Ruby 和 Java 之间序列化/解析 protobuf 对象?

java - Android 在 Activity 之间删除并添加到 ArrayList