【问题标题】:Creating a dynamic query with MongoDB, Java and Jongo使用 MongoDB、Java 和 Jongo 创建动态查询
【发布时间】:2014-10-15 13:38:42
【问题描述】:

我使用 Java、使用 Java 而不是 Scala 的 Play Framework、MongoDB 和 Jongo 的组合作为基本 Web CRUD 应用程序的过渡。即使我的字符串不包含任何非法字符,我也会不断收到 JSON 解析异常。它实际上在语句末尾关闭大括号时失败了。以下是我的错误和代码。查询字符串只是一个字符串构建器,搜索对象是否为空或有值,如果有值则附加到字符串中。

Jongo方法:

public static Iterable<OneDomain> findWithQueryString(String queryString){
    return domains().find("{#}", queryString).as(OneDomain.class);
}

控制器方法: 字符串生成器示例:

        if(queryStringBuilder.toString().equalsIgnoreCase("")){
            queryStringBuilder.append("date: {$gte : " + searchObj.dateFrom + ", $lt: " + searchObj.dateTo + "}");
        }else{
            queryStringBuilder.append(" , ");
            queryStringBuilder.append("date: {$gte : " + searchObj.dateFrom + ", $lt: " + searchObj.dateTo + "}");
        }

        String queryString = queryStringBuilder.toString();

        Iterable<OneDomain> filteredIterable = OneDomain.findWithQueryString(queryString);

给我这个错误:

   Caused by: com.mongodb.util.JSONParseException:
   {"source : Online Lists , blacklist : true , vetted : true , is : false , isNot : true"}
                                                                                          ^

以“}”上的错误结束它。

除此之外,如果我尝试通过输入 \" 来转义字符,使其变为 \"date\",它会像这样解析并出错:

   Caused by: com.mongodb.util.JSONParseException:
   {"\"source\" : \"Online Lists\" , \"blacklist\" : true , \"vetted\" : true , \"is\" : false , \"isNot\" : true"}

我真的可以这样做吗,或者因为它插入了 Java,引号将围绕整个字符串,因此它试图将其作为单个 JSON 字段读取而不是整个查询?

【问题讨论】:

    标签: java json mongodb jongo


    【解决方案1】:

    找到答案。需要放弃替换,而我的方法看起来像

    domains().find("{"+queryString+"}").as(OneDomain.class);
    

    【讨论】:

      【解决方案2】:

      首先,确保不要让自己容易受到注入攻击。阅读一般的注入攻击,尤其是 MongoDB,例如 OWASP page on Testing for NoSQL injection


      虽然您确实可以将生成的查询字符串传递给 find 方法,但我不建议这样做。当我们生成包含 jongo 替换参数 # 的查询时,我做了同样的事情并且遇到了大问题,即

      // This will throw an exception:
      // java.lang.IllegalArgumentException: Not enough parameters passed to query: {"value":"#"}
      ...find("{" + "\"value\":\"#\"" + "}")
      

      我的解决方案是传递一个 DBObject:

      import com.mongodb.BasicDBObject
      ...find("#", new BasicDBObject().append("value", "#"))
      

      也可以使用 QueryBuilder 构建:

      import com.mongodb.QueryBuilder
      ...find("#", QueryBuilder.start("value").is("#").get())
      

      如果直接在 Jongo API 中提供查询生成器支持会很好:https://github.com/bguerout/jongo/issues/173

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 1970-01-01
        • 2015-01-24
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多