使用solrj时,防止solr查询注入

Joh*_*ohn 7 solr code-injection solrj

查询HttpSolrServer.

SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(q);
QueryResponse queryResponse = solrServer.query(solrQuery);
Run Code Online (Sandbox Code Playgroud)

我需要构建一个solr查询,比如"author:*user_inputed_text*title:*user_inputed_text*"我需要类似PreparedStatement的东西,但我在solrj库中找不到类似的东西.如何构建不会引起注入的查询?如何使用户输入字符串 - \user_input_text\safe?

我正在使用连接构建查询.当我有,例如这段代码:

public String buildQuery(String userInputedText) {
    String query = "author:*" + userInputedText + "* OR title:*" + userInputedText + "*";
}
Run Code Online (Sandbox Code Playgroud)

然后用户可以注入一些子查询并接收结果,但不受限制.例如,输入的字符串是:"OR title:".所以,整个查询将是:作者:*OR标题:*OR标题:*OR标题:*

在这种情况下,用户收到所有结果(它们不受限制)并传递模式作者:*?*OR title:*?*.

Dmy*_*kov 6

请考虑使用内置的solrj ClientUtils实用程序类.通过它你可以逃脱userInputText

String escapedUserInputText = ClientUtils.escapeQueryChars(userInputText)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看queryparser语法页面.