3

基本的な Web CRUD アプリの間で、Java と Scala ではなく Java を使用する Play フレームワーク、MongoDB と Jongo を組み合わせて使用​​しています。文字列に不正な文字が含まれていないにもかかわらず、JSON 解析例外が発生し続けます。実際には、ステートメントの最後にある中括弧を閉じることに失敗しています。以下は私のエラーとコードです。クエリ文字列は単なる文字列ビルダーであり、オブジェクトが空であるか値があるかを検索し、値がある場合は文字列に追加されます。

ジョンゴ方式:

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フィールドとクエリ全体として読み取ろうとしていますか?

4

2 に答える 2

4

まず、インジェクション攻撃に対して自分自身を脆弱にしないようにしてください。一般的なインジェクション攻撃、より具体的には MongoDB に関する記事を読んでください。たとえば、NoSQL インジェクションのテストに関する OWASP ページです。


確かに、生成されたクエリ文字列を 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-09-23T08:49:41.503 に答える
0

答えを見つけました。置換を削除する必要があり、代わりに私の方法は次のようになります

domains().find("{"+queryString+"}").as(OneDomain.class);
于 2014-08-22T12:56:46.660 に答える